9月2日Shopee笔试

前言

2020年09月02日上午10点30开始,历时两小时。还好我看了一眼邮件,差点错过了。

题目包含选择题和编程题,选择那部分是15题选择题,共计45分;编程3题,分别是15分,20分,20分。

选择题还考察了加解密算法,有点忘记了,还好是选择题…

第一题

给定一个数组,然后将它们两两合并,然后记录下和。

这题我真心是糊涂了,那比如数组是[1,2,3,4,5],第一次是留下[3,7,5]呢还是[3,7]呢?我是按照第一种想的,所以很简单,因为每次的和必然是相同的,也就是我只需要计算一下中间合并的次数就可以了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public int getMinScore(int[] gz) {
if (gz == null || gz.length == 0) {
return 0;
}
if (gz.length == 1) {
return gz[0];
}
int sum = 0;
int count = 0;
int temp = 1;
for (int i : gz) {
sum += i;
}
while (true) {
temp = temp * 2;
count++;
if (temp >= gz.length) {
break;
}
}
return sum * count;
}

只过了37.5%,感觉有点emmmm,题目中也没有给更多的信息,基本是靠自己猜。

第二题

给定一个字符串,你需要补上一个字符串,使之成为循环的字符串:如ababab就是一个循环字符串。

我直接上手暴力做的,结果直接就过了….

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
public int getMinLen(String str) {
// write code here
if (str == null || str.length() == 0) {
return 0;
}

int ans = str.length();
for (int i = 1; i < str.length(); i++) {
int count = str.length() / i;
String s = str.substring(0, i);
// System.out.println("标准 = " + s);
boolean flag = true;
for (int j = 1; j < count; j++) {
String substring = str.substring(j * i, j * i + i);
if (!substring.equals(s)) {
flag = false;
break;
}
}
if (flag) {
// System.out.println("符合要求的 = " + s);
// 求出剩下的
String last = str.substring(i * count);
// System.out.println("剩下的 = " + last);
if (last.length() == 0) {
return 0;
}
if (s.startsWith(last)) {
ans = Math.min(ans, s.length() - last.length());
}
}
}

return ans;
}

第三题

要求算概率。你有两套题目,每套题目都是n题,那么当你有一天发现其中的一套已经做完了,另外一套的数学期望是多少?

我自己用笔算出来是4/5,题目中算出来是7/8,然后就完完全全没思路,因为我后来用计算机模拟概率,也是不对的….