前言 8月13日bilibili的在线笔试。一共是三十道选择题和三道编程题。平心而论是比较非常简单的。
选择题 选择题里比较有印象的是给定一个CRC的生成式 x^4+x+1,然后求1101011111的crc校验码,我不会,瞎选的。这个应该是计算机网络中第二层的时候我记得讲过,完全记不起来怎么算。
眼前一亮的是考了CSRF的防御手段,还考了docker的底层实现。总的来说广度还是非常不错的。
不过我现在有点怀疑这些有选择题的公司,是不是都是用的牛客的题库?
编程 算24点 第一题上来就非常刺激,这题看似容易,其实陷阱有点多。后来去leetcode看了一眼,emmm hard…. 放第一题是不是不合适啊。
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 public boolean Game24Points (int [] arr) { return fun(new double []{arr[0 ], arr[1 ], arr[2 ], arr[3 ]}); } public boolean fun (double [] arr) { if (arr.length == 2 ) { return helper(arr[0 ], arr[1 ]); } for (int i = 0 ; i < arr.length; i++) { for (int j = i + 1 ; j < arr.length; j++) { double [] small = new double [arr.length - 1 ]; int smallLength = small.length - 1 ; int k = 0 ; int h = 0 ; while (k < arr.length) { if (j != k && i != k) { small[h] = arr[k]; h++; } k++; } small[smallLength] = arr[i] + arr[j]; if (fun(small)) { return true ; } small[smallLength] = arr[i] - arr[j]; if (fun(small)) { return true ; } small[smallLength] = arr[j] - arr[i]; if (fun(small)) { return true ; } small[smallLength] = arr[i] * arr[j]; if (fun(small)) { return true ; } small[smallLength] = arr[i] / arr[j]; if (fun(small)) { return true ; } } } return false ; } public boolean helper (double i, double j) { if (i + j == 24 ) { return true ; } else if (j - i == 24 || i - j == 24 ) { return true ; } else if (i * j < 24.000001 && i * j > 23.999999 ) { return true ; } else if (i != 0 && j / i < 24.000001 && j / i > 23.999999 ) { return true ; } else if (j != 0 && i / j < 24.000001 && i / j > 23.999999 ) { return true ; } return false ; }
稍微解析一下:首先是helper这个函数,就是给你两个数字,然后判断这两个数字能否经过加减乘除四则运算来得到。加法、乘法很简单。减法你需要考虑是a-b还是b-a,也不难;除法就还需要多考虑一层0不能做除数。
然后通过不断缩小数组来完成我们的功能。
判断括号表达式是否合法 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 public boolean IsValidExp (String s) { int length = s.length(); if (length == 0 ) { return true ; } Deque<Character> deque = new LinkedList<>(); for (int i = 0 ; i < s.length(); i++) { char c = s.charAt(i); if (c == '{' || c == '(' || c == '[' ) { deque.addLast(c); } else if (c == '}' || c == ')' || c == ']' ) { if (deque.isEmpty()) { return false ; } if (c == '}' ) { if (deque.getLast() == '{' ) { deque.removeLast(); } else { return false ; } } else if (c == ')' ) { if (deque.getLast() == '(' ) { deque.removeLast(); } else { return false ; } } else { if (deque.getLast() == '[' ) { deque.removeLast(); } else { return false ; } } } } if (deque.isEmpty()) { return true ; } else { return false ; } }
emmm 感觉是最基础的题目了吧。我做的时候不小心把一个括号给打错了,导致过了80%….
找钱问题 题目都懒得打…太简单了…
1 2 3 4 5 6 7 8 9 10 11 12 13 public int GetCoinCount (int N) { int remain = 1024 - N; if (remain <= 0 ) { return 0 ; } int coin64 = remain / 64 ; remain = remain - coin64 * 64 ; int coin16 = remain / 16 ; remain = remain - coin16 * 16 ; int coin4 = remain / 4 ; remain = remain - coin4 * 4 ; return (coin4 + coin16 + coin64 + remain); }