前言
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) { 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); 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) { String last = str.substring(i * count); 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,然后就完完全全没思路,因为我后来用计算机模拟概率,也是不对的….