2018校招面试随笔
今年4月底入职当前互联网公司,有幸参加了公司2018校招,负责某java岗初试的一面或者二面(初试一轮或者两轮看情况的)。第一次参与校招,持续两天,今天刚忙完,晚上躺在床上竟有点睡不着,想反思下这两天的操作,文笔不佳,想到啥写点啥。
连续的面试下来,感觉被考验的既是校招生,也是自己。来面试的不乏名校高材生,更有竞赛高手,年级排名靠前的学霸,感觉多数是完胜当年刚毕业时的自己。
由于很多学生并不会java,自己给面试者准备的内容一是操作系统、计算机网络、算法与数据结构、http相关随机发问;二是简历上的项目深挖(但是感觉对于学生的python和c++项目大多数最终还是面试效果不太理想,需要提升自己的技能覆盖面);三就是最后的编程题;
在最后的编程题上,主要准备了三道不同的题目,看心情随机问。其一是回文算法,比较简单,但答上来后会升级,升级后寻找当前字符串的最长回文子串,不要求实现给出思路就行;其二是寻找两个字符串的最大公共子串;其三是自创的兔子问题改编版:初始有一对成年兔子,成年兔子每3个月会生一对兔子(一开始说成年当月不生,后来干脆统一成年当月也生),小兔子需要4个月成年,成年兔子1年后死亡,求n个月后兔子对数。
总的来说在内容一、二上的面试感觉自己做的还可以,但在编程题的面试过程中,还是有很多需要改进的敌方(睡不着的主要原因,觉得是不是有点对某些好学生不公平?)。
其一是对于回文算法的升级版,前两个编程题都是反复挑选的网上的题,因此也是有看过网上能找到的各种实现。答案其实多重多样,但在第一天上午的面试中,有一个同学在升级难度后最终没找到思路,最后请求我给出见解,略微遗憾的是,当时我一下子也忘了怎么弄了,遂把前一个学生的解答思路回复给他(把字符串反转,然后就变成了题2,可以有新的思路了),但其实也并没有为该同学解答困惑。
其二是对于求最大公共子串问题,没有适当准备给面试者的提示,陷入当面试同学请求提示时感觉提示了就毫无难度了,不提示又不太好的尴尬境地(最坏的结果是换题,换题非常不好,音响很深的一妹子被我换题后问懵了,感觉跟自己没准备好这题的提示有一定的关系)
第三题自创的题,自己准备了一套面向对象的解法,但由于多数同学不会java,最终也没有同学按照我的思路来。不过也得到了各种千奇百怪的答案,各有特色,现场无法逐一验证, 很多答案在现场沟通中暂时没发现漏洞。(ps:所有的同学都忽略了兔子会死亡的设定,选择性忽略?)
下面是自创兔子问题的答案,不是最优解但感觉思路明朗。
@Data class Rabbit { public static List<Rabbit> rabbits = new ArrayList<>(); //兔子池 public static int month = 12; //目标月 private int age = 0; private boolean alive = true; public Rabbit(int age) { this.age = age; } public void grow() { this.age++; if (age >= 4 && age < 16) { breed(); } if (age == 16) { die(); } } private void breed() { if (this.age % 3 == 1) { rabbits.add(new Rabbit(0)); } } private void die() { this.alive = false; } public static void main(String args[]) { Rabbit rab = new Rabbit(4); rabbits.add(rab); for (int i = 1; i <= month; i++) { int temp = rabbits.size(); for (int j = 0; j < temp; j++) { rabbits.get(j).grow(); } } System.out.print(rabbits.stream().filter(i -> i.isAlive()).count()); } }