这第二期漫谈笔者打算记录一下春招经历下来最有趣的一个公司——钉钉的一面与二面。

写在前面 链接到标题

钉钉我是在牛客上投的,简历初筛通过后很快就接到了后来一面面试官的电话,让我走内推去官网投递,我投完后不到半小时又来了一个电话,跟我说官网的简历 hr 已经通过了,让我好好准备笔试,还给了一些准备的方向,很感激这个善良的面试官,给了经受两次一面折戟的笔者十分宝贵的肯定,让笔者在那段焦虑的日子里看到了光亮。

一面 链接到标题

钉钉的一面其实是很典型的手撕面,让经历三次一面全是八股面的笔者眼前一亮,面后复盘时越想越觉得这次面试设计的十分优秀,下面就简单回顾一下这次神奇的手撕面。

约定的是 14:00 开始面试,面试官很准时的给笔者打来电话,告诉笔者已经往笔者邮箱里发了一封带有编辑器连接的邮件,让我点开来做里面的题,二十分钟后再来联系笔者继续下面的流程。

以下是编辑器里的题目:

  1. 堆排序、归并排序、快速排序各自的时间与空间复杂度分别是多少,是否稳定?

  2. 没有任何限制的前提下(可以导任何包,用任何方法,没有时间复杂度的要求),完成排序。

public int[] sortArray(int[] input) {

}
  1. 手动实现快排或堆排序,完成排序。
public int[] sortArray(int[] input) {

}
  1. Arrays.sort 底层选择的是什么排序算法,为什么这样选?

  2. 手动实现快排或堆排序,完成排序。

public List<T extend comparable> sortList(List<T> list) {

}

笔者完成这五题后还没到二十分钟,在编辑器边上的在线聊天窗口呼唤了面试官,开始了下半场更狠的拷打。

针对第一题,面试官提问:为什么快排是不稳定的?如何在不损失时间复杂度的前提下怎样设计一个数据结构来使快排稳定?

针对第二题,面试官要求三十秒内再想一个排序方法,无论这个方案有多么低效甚至可笑(但是手写算法只被视为是同一种),一直加码直到想不出来。

针对第三题,因为笔者手写的是堆排序,所以面试官询问了一下笔者手写快排的时间与平时刷 Leetcode 的情况,比如速度、正确率什么的。

针对第四题,面试官提问:有读过这部分源码吗,知道这里的快排和标准的快排有什么区别吗?如何优化的?之后追问了几轮不同的优化方案,直到想不出来。

此外还问了如果基准只找第一个元素,排序之前进行一轮洗牌后的效果与不洗牌有区别吗?

针对第五题,面试官提问这里 <T extend comparable> 有什么作用?直接是 <T> 可以吗?

A. List<int>
B. List<Integer>
C. List<Object>

以上三者可以正常的作为参数传入 sortList 函数吗,如果不可以讲讲原因。

深度拷打结束后就简单了解了一下实习与项目经历中遇到的问题和如何解决的,一轮充满压力的手撕面就结束了。

二面 链接到标题

二面主体就是笔者的实习与项目经历,因为有淘天二面与三面的经历在前,笔者对自己写的这些项目的了解已经十分深入了,无论是介绍还是回答面试官的问题都十分自信流利,也看得出来面试官对笔者的表现十分满意。

技术部分结束后本次面试有意思的正片才刚刚开始,面试官甩出了三个尖锐的问题:

  1. 你是否同时在面其他公司?

笔者如实回答淘天 hr 面试刚刚结束。

  1. 如果要你在淘天、钉钉、腾讯、字节这几家公司里选一个,你会选谁?

笔者十分高情商的回答了这个送命题()。

  1. 你有女朋友吗?

复盘时笔者怀疑是因为上一个送命题回答的太高情商了,面试官觉得笔者是不是平时经常被女朋友训练,可事实上笔者已经单身很久了()。

最后还询问了一下笔者是否知道钉钉这样的办公软件的大市场情况,然后就进入了反问环节。

最后 链接到标题

不知道读者你读到现在是否已经汗流浃背了,但不得不说这两轮面试让笔者感受到了大厂对程序员的要求之高,这样的一面并不是单纯突击背诵八股文就可以应付的,需要扎实的数据结构与算法基础,甚至考察了候选人是否有阅读源码的经历,作为基础面可以说是十分全面了。