8月10日快手校招一面

前言

快手提前批的一面,面试官迟到了5分钟,跟我说明了情况,是因为前面有个同学延迟了。小哥哥人挺好的,很温柔。

上来先按照惯例,自我介绍。然后我的自我介绍项目因为主要是做android的,面试官说了一下,然后又介绍了一下他们的部门。

下面是具体的面试题:

  • 项目中哪一块有技术挑战性,或者说哪一块是最能show出你技术的。
  • 高并发情况下,怎么保证不会出现库存超卖。
  • Redis分布式锁,如果并发量特别大,会影响效率,怎么解决呢?
  • 我看到你用到了ES。我说了我这个ES只是用一下,没有深入去了解过。
  • java中的多态,是怎么实现多态的?能举一个多态使用的场景吗?
  • java中的重写和重载有什么区别?
  • java中都有哪些集合类?稍微介绍一下这几种。
  • ArrayList的底层是用什么实现?LinkedList底层用的是什么实现?
  • 随机访问一个元素应该用哪个呢?
  • java里面有hashmap和hashtable,它们有什么区别呢?
  • java多线程实现的几种方式。
  • 有几种常见的线程池的类型,介绍一下
  • 说一下jvm的简单调优,有哪几种方式。
  • 如果系统出现了问题,说一下你的排查思路
  • mysql什么时候加行锁,什么时候加表锁
  • mysql有哪几种类型的索引
  • 假设目前有一个联合索引(a,b,c) ,那么如果where条件里是c=1 and a=3会用到索引吗?如果是a=1 and b in (2,3) 会使用索引吗

算法题1:给定一个数组,让每个元素都最多出现一次,打印出所有的排列组合。

我一开始理解成了全排列的问题,用的dfs,面试官最后认为还是需要使用分解成子问题来做。

算法题2(不需要实现):两个有序数组合并。

给出我的全排列的实现:

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
public class Interview {

public static void main(String[] args) {
char[] array = {'a', 'b', 'c', 'd'};
List<Character> list = new ArrayList<>();
for (int i = 0; i < array.length; i++) {
list.add(array[i]);
}
dfs(array, 0, list);
}


private static void dfs(char[] array, int index, List<Character> list) {
if (index == array.length) {
// 到结尾了
System.out.println(Arrays.toString(array));
return;
}

// 修改array的值
int len = list.size();
for (int i = 0; i < len; i++) {
array[index] = list.get(i);
Character remove = list.remove(i);
dfs(array, index + 1, list);
list.add(i, remove);
}
}
}

反问:你觉得我表现怎么样?

就是在编程的时候,你需要把你的思路理顺了,你需要证明你的思路是没有问题,这个时候再去动手写代码。今天可能这个题目,稍微有一点,就是刚开始的时候思路没有理得太顺吧。对,然后刚开始再去调整的话,你的思路会被之前的思路给带偏。