作为面试官的一点感想
这几天公司在组织校园招聘,博主作为面试官参加了几场面试,简单聊一聊感想。
手写代码较为薄弱
纸上代码是比较热门的一种技术面试手段,要求面试者在纸上实现代码,参加过这种面试形式的同学一定深有感触,这是一种看上去简单但实际上绝不简单的面试方法,对应聘者要求较高。
要知道纸上写代码不比IDE,在IDE上各种智能提示,语法高亮,代码增删改极为容易,但是纸上代码就不一样了,在纸上写代码是很难修改的,改来改去就会导致最后的代码根本没法看,这就要求面试者在下笔之前要胸有成竹,而不是想到哪写到哪,觉得不对再回头修改,在下笔之前要有通盘的全面的考虑,这对应试者的能力要求是比较高的。因此,纸上代码经常见于技术面,要想攻克纸上代码无它,送你几个字:
practice, practice, practice
不过今年因为疫情的关系都采用了线上面试,因此面试同学可以在自己的电脑上用IDE写代码,但就是这样也能看到大部分同学都不熟练。
在这里透露一个博主常用的简单算法题:给定一个链表,判断链表是不是回文,所谓回文就是对称,像123,就不是回文;121就是。
这其实是一个非常简单的题目,但博主没有想到的是,只有为数不多的同学能正确无bug写出,这个题目的实现代码见文末。
有的同学可能会问,为什么现在都要问算法呢?答案其实非常简单:
talk is cheap,show me your bug!
Sorry,show me your code!
限于背景知识你的研究项目面试官未必懂,任你说的天花乱坠面试官又没参与你的项目,所以没有一个对你能力判断的直观感受。
但算法就不一样了,这里不存在背景知识的问题,我们数据结构总学过吧,我们也都知道链表吧,有这些就够了,在这种情况下面试官可以直观感受面试同学的代码能力。
当然,纸上代码也只是考察的一方面,大家都985,211了,这些练习应该难不倒你。
面试是需要准备的
可能是因为面试经验不足,很多同学明显是没有准备的,问一些基础问题很多都答不上来,然后归咎于之前学过忘掉了,其实这些基础知识面试官还是挺看重的,而且也不难准备,把之前学的课程再拿出来看看,实际上工作之后就会发现,之前觉得最无聊的基础课程其实恰恰是最重要的,工作中遇到的很多问题都是因为基础不牢固,相信很多工作后的同学会有感触。
这里的基础指的是操作系统、计算机网络、编译原理等。顺便说一句,博主工作后深感基础的重要性因此将操作系统相关知识进行了整理,我将其命名为《操作系统:以程序员的角度》,以此致敬CSAPP(Computer Systems: A Programmer's perspective),中文译作《深入理解计算机系统》尽管我并不认为这是一个好的译法。《操作系统:以程序员的角度》目前正在连载,进入公众号点击底部“操作系统”菜单栏获取。
就简单的唠叨这几句吧,文末附上面试题代码,祝大家周末愉快!
ListNode* reverse_list(ListNode* head) {
if (head == NULL || head->next == NULL) return head;
ListNode H(0);
while(head) {
ListNode* t = head->next;
head->next = H.next;
H.next = head;
head = t;
}
return H.next;
}
bool compare_list(ListNode* LA, ListNode* LB) {
while(LA && LB) {
if (LA->val != LB->val) return false;
LA = LA->next;
LB = LB->next;
}
return true;
}
bool isPalindrome_new(ListNode* head) {
if (head == NULL || head->next == NULL) return true;
ListNode H(0);
H.next = head;
ListNode* pre = &H;
ListNode* slow = head;
ListNode* fast = head;
// 找到中间节点
while(fast && fast->next) {
pre = pre->next;
slow = slow->next;
fast = fast->next->next;
}
// 划分为两段,一段是LA,一段是LB
pre->next = NULL;
ListNode* LA = head;
ListNode* LB = slow;
// 翻转LB
LB = reverse_list(LB);
// 比较
return compare_list(LA, LB);
}