8月6日京东校招笔试题

前言

记录的是京东正式批进行的笔试。总体感觉就一个字:… 我提前一小时交卷了。

然后是吐槽一点:就开一个摄像头作为监控吗??那岂不是想怎么搞就怎么搞了?算了..反正笔试这种东西…看看就行了,自己靠实力做就行了。

选择题

这是我第二次做这种笔试题,前一次是PDD那里的,人家出了4道算法题,看你过几道然后给分。京东这里明显不一样,我记得是30道选择题60分,然后2道编程题给40分。

选择题基本都是来送的,唯一让我有印象的几道题:

  • 一道是关于连通图的,我早就忘光了,就随手选了一个。
  • 一道是栈溢出的,我只能凭借我的回忆来写一下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class StackOverFlow {
public static int i = 0;

public static void main(String[] args) {
func(i);
System.out.println(i);
}

public static void func(int i) {
if (i > 8888888) {
return;
}
i++;
func(i);
}
}

判断下这个的输出结果,给定的栈和堆都是128M。我没怎么计算就直接选了一个java.lang.StackOverflowError

  • 什么顺序文件查找算法?没听过,就感觉像二分查找,根据这点直接乱选了一个。

  • shell中的shift;

  • Linux是嵌入式系统吗?Linux支持所有的因特网协议吗?忘了我选了什么,现在来看如果硬要二选一,我感觉Linux应该并不能支持所有的因特网协议。

  • 数据库实体完整性,真的不了解这些概念上的东西。

大概就这几题稍微有点不太会,其它就是直接看题选答案。不过做到后来发现居然是有多选的,emmm希望我没漏选吧。

编程题

第一题

第一题是给你一个数学公式:f(n)=1/5-1/10+1/15-1/20+1/25-......+1/(5*(2*n-1))-1/(5*2*n),让你给出f(n)的值。这题给我第一感觉就是需要用BigDecimal来做,否则有可能精度会出现问题。然而事实是,我想多了….题目中要求四舍五入保留4位小数,且n<=100….那么代码就很简单了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Main {

public static double result = 0.0;

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
System.out.println(helpler(n));
}

public static String helpler(int n) {
while (n > 0) {
double temp = 1.0D / (10 * n - 5) - 1.0D / (10 * n);
result = result + temp;
n--;
}
return new BigDecimal(result).setScale(4, BigDecimal.ROUND_HALF_UP).toString();
}
}

毫无难度可言….

第二题

给定两个数字N和M,求这两个数字之间的数字,满足:去掉一位数之后,是回文素数的数字有多少。

首先需要理解下回文素数,那就是这个数字必须又是回文,又是素数,这个的判断非常简单:

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
public static boolean isPalindrome(int num) {
String s = String.valueOf(num);
int low = 0;
int high = s.length() - 1;
while (low < high) {
if (s.charAt(low) != s.charAt(high)) {
return false;
}
low++;
high--;
}
return true;
}

public static boolean isPrime(int num) {
if (num < 2) {
return false;
}
if (num == 2) {
return true;
} else if (num % 2 == 0) {
return false;
}
for (int i = 3; i < Math.sqrt(num) + 1; i = i + 2) {
if (num % i == 0) {
return false;
}
}
return true;
}

同时满足这两个函数,就是一个回文素数了。

然后是去掉一位数的意思,比如我有一个数字是12345,那么去掉一位数有五种可能:2345,1345,1245,1235,1234。只要这五个数字中有一个是回文素数,那么我们就认为12345是满足条件的。

最简单的思路就是每来一个数字,我们把它每个位都去掉一次,然后对这五个数字分别进行上面两个函数的判断。但是且慢,这样会浪费很多的时间,因为有非常多的重复。

所以我最后给出的答案是:我先找到指定范围内1-100000之间的所有的回文素数(一百来个吧),然后用一个list保存一下,最后只需要判断一下数字在不在这个list里面就可以了。

所以最后的算法是:

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
public class Main {
private static List<Integer> list = new ArrayList<>();

public static void main(String[] args) {
// 通过下面的函数可以生成这个1-100000之间的数组
int[] array = {2, 3, 5, 7, 11, 101, 131, 151, 181, 191, 313, 353, 373, 383, 727, 757, 787, 797, 919, 929, 10301, 10501, 10601, 11311, 11411, 12421, 12721, 12821, 13331, 13831, 13931, 14341, 14741, 15451, 15551, 16061, 16361, 16561, 16661, 17471, 17971, 18181, 18481, 19391, 19891, 19991, 30103, 30203, 30403, 30703, 30803, 31013, 31513, 32323, 32423, 33533, 34543, 34843, 35053, 35153, 35353, 35753, 36263, 36563, 37273, 37573, 38083, 38183, 38783, 39293, 70207, 70507, 70607, 71317, 71917, 72227, 72727, 73037, 73237, 73637, 74047, 74747, 75557, 76367, 76667, 77377, 77477, 77977, 78487, 78787, 78887, 79397, 79697, 79997, 90709, 91019, 93139, 93239, 93739, 94049, 94349, 94649, 94849, 94949, 95959, 96269, 96469, 96769, 97379, 97579, 97879, 98389, 98689};

for (int i : array) {
list.add(i);
}
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
in.close();
int result = 0;
for (int i = n; i <= m; i++) {
if (helper(i)) {
result++;
}
}
System.out.println(result);
}

public static boolean helper(int num) {
// 必须排除一位数的干扰
if (num < 10) {
return false;
}
String s = String.valueOf(num);
for (int i = 0; i < s.length(); i++) {
String temp = s.substring(0, i) + s.substring(i + 1);
Integer integer = Integer.valueOf(temp);
if (list.contains(integer)) {
return true;
}
}
return false;
}
}

总结

京东的这次笔试怎么说呢,编程题比我想象中简单太多了。然后选择题这块,如果它是一个很大的题库,然后每个人都从中都选出一些来做,那我觉得还可以,因为可以稍微保证公平性;如果所有的人都是一样的选择题,那…..JD就不考虑有人拉了群然后直接在群里共享答案吗?不单单需要打开摄像头,我感觉最最起码的屏幕共享总是要的吧?不然真的有什么公平性可言呢?

还有几点对考试系统的改进:选择题做完直接交卷,而且不可修改,不太理解为什么要这么设计。编程题我到现在都不知道怎么看自己的案例通过了百分之多少….