笔试题1

小Q定义了一种数列称为翻转数列:
给定整数n和m, 满足n能被2m整除。对于一串连续递增整数数列1, 2, 3, 4…, 每隔m个符号翻转一次, 最初符号为’-‘;。
例如n = 8, m = 2, 数列就是: -1, -2, +3, +4, -5, -6, +7, +8.
而n = 4, m = 1, 数列就是: -1, +2, -3, + 4.
小Q现在希望你能帮他算算前n项和为多少。

输入描述:

输入包括两个整数n和m(2 <= n <= 109, 1 <= m), 并且满足n能被2m整除。

输出描述:

输出一个整数, 表示前n项和。

笔试题1-代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.Scanner;

public class Test_1 {
public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
long s = System.nanoTime();
if (n % 2*m !=0){
return;
}else if (m < 0){
return;
}else if (n < 2 && n > Math.pow(10,9)){
return;
}
System.out.println(n*m/2);
long e = System.nanoTime();
System.out.println((e-s)/1000000 + "ms");
}

}

笔试题2

牛牛和羊羊正在玩一个纸牌游戏。这个游戏一共有n张纸牌, 第i张纸牌上写着数字ai。
牛牛和羊羊轮流抽牌, 牛牛先抽, 每次抽牌他们可以从纸牌堆中任意选择一张抽出, 直到纸牌被抽完。
他们的得分等于他们抽到的纸牌数字总和。
现在假设牛牛和羊羊都采用最优策略, 请你计算出游戏结束后牛牛得分减去羊羊得分等于多少。

输入描述:
1
2
3
输入包括两行。
第一行包括一个正整数n(1 <= n <= 105),表示纸牌的数量。
第二行包括n个正整数ai(1 <= ai <= 109),表示每张纸牌上的数字。
输出描述:
1
输出一个整数, 表示游戏结束后牛牛得分减去羊羊得分等于多少。
输入例子1:
1
2
3
2 7 4
输出例子1:
1
5

一种弄简单的java代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.util.*;

public class Test_2 {
public static void main(String[] args) {
//input
Scanner scanner = new Scanner(System.in);
String[] arr = new String[2];
for (int i = 0; i < 2; i++) {
arr[i] = scanner.nextLine();
}
int m = Integer.parseInt(arr[0]);
Integer[] array = new Integer[m];
String[] a = arr[1].split(" ");
for (int i = 0; i < m; i++) {
array[i] = Integer.parseInt(a[i]);
}
Arrays.sort(array,new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
if (o1 < o2)
return 1;
else if (o1 > o2)
return -1;
else
return 0;
}

});
int niuniu = 0;
int yangyang = 0;

for (int i = array.length - 1; i >= 0; i--) {
if (i % 2 ==0){
niuniu += array[i];
}else{
yangyang += array[i];
}
}

System.out.println(niuniu - yangyang);
scanner.close();
}
}

高级python实现:

1
2
3
4
5
6
7
n = int(input())
num_list = list(map(int, input().split()))
num_list.sort(reverse=True)
s = 0
for i in range(n):
s += (-1) ** i * num_list[i]
print(s)

笔试题3

小Q的父母要出差N天,走之前给小Q留下了M块巧克力。小Q决定每天吃的巧克力数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力

输入描述:
1
2
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,表示父母出差的天数N(N<=50000)和巧克力的数量M(N<=M<=100000)。
输出描述:
1
输出一个数表示小Q第一天最多能吃多少块巧克力。
输入例子1:
1
3 7
输出例子1:
1
4

java代码实现:

1

笔试题4-两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

python代码实现:

1
2
3
4
5
6
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
for j in range(i+1,len(nums)):
if nums[i] + nums[j] == target:
return [i,j]

写在最后

欢迎大家关注鄙人的公众号【麦田里的守望者zhg】,让我们一起成长,谢谢。
微信公众号