头图

个人背景

这篇文章谈的是我的面试经历,选取了参加的面试中比较有代表性的一次,也是我最后选择加入的公司。笔者是2021刚毕业的大学本科生,就读于上海的一所普通一本学校,学的是计算机科学与技术专业,绩点在年级10%左右,有过科创项目参加大创赛。交待这些背景主要是让大家了解我个人的一个情况,以此为基准对读者有所参考。本文着重于面试经历的分享,即使不是学计算机的同学也可以大致看懂。

由于之前因为考研调剂的一些耽搁,导致我到了4月份才正式地开始准备春招。这其实已经算是危险地时间了,因为大多数公司在4月底就会关闭春招通道,剩下的公司质量也可想而知。在清明后,我集中复习了一周左右,之后就开始陆续参加面试,到劳动节前正式敲定了最后的去向。

前期准备

由于笔者原准备考研后做机器学习相关的工作,但无奈能力有限没有考上,之前对于软件开发技术的JAVA这块接触地很少,再加上时间很紧,所以最终选择了去做测试开发工程师。由于平时PythonC++用得比较多,语法方面没什么大问题。

我主要是参考了牛客网上的面试经验,在应届生校招中,面试主要考察的是计算机的基础知识,就是那大四样,计算机网络操作系统计算机组成原理数据结构。由于之前复习考研的时候过过一遍,所以问题不是很大,具体需要掌握哪些知识可以参考面经里的面试题,将各个问题进行分类统一复习。另外就是数据库,这块不是说知道数据库的基本语法就可以了,而是要非常细地复习。比方说MySQL有哪些引擎,有什么区别;索引的作用,如何进行索引优化;存储过程的概念等。这些方面都是做软件开发和测试所必须要了解的,因为以后肯定要用到的。

另外就是编程方面,可以去刷一些牛客网LeetCodeEasyMiddle的题,像基础的数据结构(栈、二叉树、链表等)还有算法(动态规划、排序等)都是必须要掌握的。</font>

在准备方面建议大家按照大厂的要求准备,多去看大厂的面试题。虽然过程有时会比较痛苦,他们的很多问题都问得很深。如果能把这些题都弄懂,那其他的面试就游刃有余,还可以增强个人的自信心。

一面 直属主管面试

笔者面试的是一家做自动驾驶的公司,总部在上海。首先面的是我的直属主管。

在个人介绍后进入暖场环节,主要就是问了下简历上的项目经历和毕业论文的情况。我有个项目做的是一个舆情分析系统,在里面负责数据分析。但面试官在聊到这个项目的时候问了下其中关于爬虫实现的问题(简单来说爬虫就是把网上的信息进行自动化采集,这部分也是所有大数据相关项目的第一步)。她问了一个是如何更高效地爬取信息,二是如果网站有一些反爬措施会如何处理。虽然这和我做的没有交集,但平时我们小组内也会一直交流,在一些课设答辩我也会旁听,对爬虫方面有所了解,也是回答出了这两个问题。在简历上提到了的项目必须自己要对其有足够的了解,因为这准备起来是最容易也最不容易丢分的环节,对于项目中发生的一些问题和解决办法自己也要在面试前回忆一下,最后在脑中再组织一下语言,不要自己做过的项目都一问三不知,这对面试官印象就不太好了。

接下来就是问技术的环节。首先问了对测试开发的理解,接下就是那大四样和数据库。她问得都是很基础的问题,但同时问得也很细。比方说从数据库索引深挖,从作用到索引优化的原则,再到对于特定例子进行索引优化,是这样写好还是那样写好,对比分析。

然后就是手撕代码的环节。题目也不是很难,即使没学过计算机的同学也能想出解题思路。

题目第一问是有一辆车(满油)从起点开到终点会经过n个加油站,每个加油站都能将油箱加满,n个加油站间的距离描述为一个1*(n-1)的矩阵例如a[3,4,6,... ,2],油箱容量为C,问该车是否能到达终点。

这其实算是一个逻辑题,既然问的是是否能到达,那我在每个加油站都给他加满就行了,如果连这样都无法到达终点,那肯定就Failure了,那进一步说只需要油箱容量C大于矩阵中任意数就好了,也就是C >= max(a)。代码如下所示:

def bool reach(C,a):
    """
    C 油箱容量
    a 加油站距离矩阵
    return true/false
    """
    if C >= max(a):
        return True
    else:
        return False

第二问是在能到达目的地的情况下,最少需要加多少次油。这其实也很简单,只要在到达每个加油站时判断现在的油量是否能行驶到下一个加油站就行了。因为是求最小值,那在加油时肯定就要加满。代码如下所示:

# python
def int get_num(C,a):
    """
    C 油箱容量
    a 加油站距离矩阵
    return fill_num 加油次数
    """   
    fill_num = 0    #加油次数初始为0
    fuel_weight=C   #油量起初为满
    for i in range(len(a)-1):
        fuel_weight = fuel_weight - a[i]
        if fuel_weight < a[i+1]:
            fill_num = fill_num + 1
    return fill_num

可以看到,这两道面试题其实都不是很难,主要考察的是思维过程和写代码时的一些习惯。

接下来问了我一道智力题,它是一个优化问题。题目是64匹马,8个跑道,选出其中跑的最快的4匹,最少需要几次。我当是回答是Top4的方法(每次取前4,需要8+4+2+1=15次),但其实还有很多优化空间,感兴趣的同学可以看这篇推文,还是挺有意思的。

一面也差不多结束了,最后就是聊了下公司的主要业务和测试开发负责的内容等等。面试题除了最后的智力题,其他都回答上来了,难度还算中等。

二面 技术主管面试

由于我是现场面试,一般是一个下午走完所有流程。二面是技术主管面试,看上去就是一个很厉害的工程师(后来才知道他是保送清华的大佬)。同样,自我介绍后开始按照简历提问,他主要侧重问了下我毕业论文的情况,我的毕业论文写的是强化学习和脑机接口方面的,主要是通过强化学习方法处理脑电信号数据。之后也聊了下公司主要的业务和未来的额发展方向。

之后就是手撕代码环节,也是一道比较常规的题目,题目是大整数相减,应该很多面试题里都有涉及。但当时可能心有点急了,有些情况没有考虑到。比方说先判断两数大小啊之类的一些判断。由于是大整数,用一般的intfloat是没法存储的,需要用字符串存储。具体代码如下:

//C++
#include <iostream>
#include <algorithm>
using namespace std;

string sub(string a, string b) {
    string res = "";
    int borrow = 0;
    int i = a.size() - 1, j = b.size() - 1;
    while (i >= 0 || j >= 0) {
        int x = i >= 0 ? a[i] - '0' : 0;
        int y = j >= 0 ? b[j] - '0' : 0;
        int z = (x - borrow - y + 10) % 10;
        res += '0' + z;
        borrow = x - borrow - y < 0 ? 1 : 0;
        i--, j--;
    }
    reverse(res.begin(), res.end());
    //删除前导0。循环条件是res.size()-1是为防止"0000"的情况
    int pos;
    for (pos = 0; pos < res.size() - 1; pos++) {
        if (res[pos] != '0') break;
    }
    return res.substr(pos);
}

bool isLess(string a, string b) {
    if (a.size() == b.size()) return a < b;
    return a.size() < b.size();
}

string subStrings(string num1, string num2) {
    string res;
    if (isLess(num1, num2)) {
        res = sub(num2, num1);
        res.insert(0, "-");
    }
    else res = sub(num1, num2);
    return res;
}


int main() {
    string a, b, c;
    cin >> a >> b;
    cout << subStrings(a, b) << endl;
    return 0;
}

这道编程题主要还是看很多情况有没有考虑到,最后在面试官的引导下最终完善了代码。

HR交流

在两场面试后,HR进来和我聊了下,主要谈了下公司福利,技术氛围之类的。这时感觉这次面试的结果应该还是不错,应该能拿到Offer了。

终面 CEO面

说实话,当HR通知我还有CEO面的时候我震惊了。一是面试到现在从来没见过还有这种面试的,二是也不知道老板会问啥,咨询了一下我的本科导师,他让我准备了一下深度学习和当下的一些前沿知识。在准备的时候也是看了相关的很多论文,还把老板在一些会议上的演讲都看了。

没想到最后老板也只是和我聊聊天,问问家乡啊,未来的规划啊等。此外他说了一句话也让我有点心动,他说“没事不知道你方不方便说说目前Offer的一些情况,我们这边可以竞争一下,我们也边开的一些条件也不会亚于大厂”,当时就感觉老板很实在,我们之间是一个平等的沟通,这是很难得的,这也是我最后选择这家公司的一个原因。我后来回道“目前可能薪资方面也不是我主要考虑的一个点,薪资固然重要,但我目前看重的还是发展的环境和个人能力的提升”。

写在最后

其实可以看到,这场面试从头至尾并没有问什么特别难的问题,比较注重基础,这就需要对一些基础知识有比较深入的理解。有些简单的知识不是说看一遍就结束了,而要知其所以然,另外还需要能正确地表达出来。现在看来,能最终进入这家公司也是很幸运,后来HR和我说,他们招的很多都是浙大交大的同学,可能测开这边比较缺人,而且面试的题我基本都准备到了,确实是运气很好了。

现在进入公司工作半年多了,觉得公司的氛围很不错。公司内部是技术驱动,大家都踏踏实实干事,没有某些公司的明争暗斗。在这期间也学到了很多,最终选择这家公司也是一个正确的选择。

最后,希望这篇文章能给你带来帮助。


子非鱼
1 声望0 粉丝

CS毕业生,现就职于上海某自动驾驶公司