面挂13家公司,23ng上岸失败实录(含所有面经)

来自其他站点
21年实习早早上岸的自己怎么没想到23年的自己真的会走到这一步。发一个帖子整理了之前面试的面经,有兴趣的最近有面到的可以看看。另一方面也想看看地里前辈有没有合适的岗位可以给一些机会,感谢!

1. 背景介绍

我现在正在USC读cs37,21fall入学,按照正常按照i20计划是23年底毕业,但是还是准备着23Spring毕业,想着早点毕业早点工作。现在计划失败,我并没有向学校申请毕业,所以准备23fall再选些课,到时候再毕业。我之前因为疫情在国内有过1~2年的工作经验,主要在自动驾驶行业。去年暑假我在图森sd定位组实习,由于众所周知的原因并没有return。我的技术栈主要是SLAM,3D reconstruction,c/c++,稍微带点learning的东西。找的工作general sde,slam算法和c/c++的岗位都有过尝试,如果地里的前辈有任何的合适的岗位也希望可以给一些机会,不管是全职还是实习(我也可以summer+fall full time实习),ng或者要求1~2年experienced都可,再次感谢!

2. 面试

面试的主要出题集中在这几大领域:leetcode题c/c++的八股概率论(集中在贝叶斯条件概率的那些),采样线性代数3D GeometrySLAM基础graphics点线面

这些面试时间线横跨从22年11月份到现在,具体时间线我就不介绍了,主要是面试内容的介绍。

2.1 Tesla

Manager在LinkedIn上reach out我,说是想找Spring的实习生,技术栈是SLAM,应该是地图定位部门的。在交流的时候,发现他好像更倾向于full time intern,但是USC政策不允许学分超过4分的学期做full time internship,只能part time而且得在LA或者remote。但即使这样还是面了两轮

  • 一面:
    • coding:出了一个简单的数组操作,flatting list。类似于这种[[1, 2, 3], [4, 5, 6], [7], [8, 9]] -> [1, 2, 3, 4, 5, 6, 7, 8, 9],但是左边可以有很多层,维度未定,我用recursive弄了弄,然后他问我是不是不怎么写python(python应该会有更方便的语法去弄)...我说对...工作都是写c++
    • 接着就开始问概率论的东西了,bus A到达时间从0到1小时均匀分布,bus B到达时间从0到0.5均匀分布
      1. 0.1小时恰好bus A到达的概率?0.1小时恰好bus B到达的概率?答:都是0
      2. 虽然都是0,上面两个哪个更可能到达?答:bus B
      3. 问题都没听懂,但问的应该是贝叶斯公式的东西,因为他问我这个公式知道吗?我就说P(A∩B) = P(A)P(B|A)=P(B)P(A|B)。后面我搞清楚了,应该是条件概率的应用,问题应该大致类似于bus A比bus B早到的概率,用条件概率做积分即可。
  • 二面:(没想到会有二面
    • coding:考了个prefix sum,做完了
    • 线性代数:Find the dimension and construct a basis for the four subspaces associated with the following matrix。大致是线代里面的找一个nxn方阵的子空间,那个方阵不是满秩的,是n-1的。我这时候并没有复习到线代,所以这里可以说非常惨烈

结果:后面Tesla就ghost了,我自己也非常非常清楚原因,不能full-time实习+面得非常差

2.2 OPPO 北美

这个是OPPO北美给手机做AR的团队,也是团队的某个成员在LinkedIn上看了我的profile,然后就有了后面的面试。岗位名字是senoir/staff的,但是不知道为啥给了我面试。

  • 一面:
    • 先对着我的简历聊了聊之前的经历,主要集中在vSLAM和3D reconstruction
    • 问了epipolar 和homography,都现场给他推导出来了
    • 接下来就开始迷惑了,先是问我知不知道针孔摄像头模型,我说知道
      • 他:有的时候即使模型参数标定对了,也会有误差是为什么?
      • 我:说明你的图像还带有其他畸变,这些是针孔模型所描述不出来的
      • 他:没有畸变
      • 我:没有畸变的话,假设你的标定完全准确,没有任何计算误差,这不应该有什么误差呀?除非是x,y方向上的映射,不单单是跟x,y方向上的坐标有关系,比如x方向上的映射即跟x方向的像素坐标有关,也跟y方向上的像素坐标有关(我为了帮助他描述问题,写了一下针孔模型的映射方程,并解释了哪个参数代表什么
      • 他:也不是这个意思
      • 我迷惑了
    • 在我写出映射方程之后,面试官甚至后面跟我道歉说自己没说清楚问题,我就更迷惑了...

结果:后面ghost了两周,再去问就说拒了,虽然说自己清楚肯定够不到senior岗,但是就这么莫名其妙挂了还是心有不甘...

2.3 Pegasus

中文是云骥智行,21年才成立的初创,在国内和北美都有岗位。一位学姐帮我内推北美的机会。

这个聊了很久,可能得有一个半小时,对着我的简历问了很多的细节,没有问什么domain knowledge。但是最后问我,能不能spring先全职实习,然后毕业再全职入职。我说spring full-time可能有点困难。然后还问我,如果给了我offer就一定会去吗?我:... 说了一些违心但是体面的话。但是大致是比较华人的公司了orz

结果:不出意外的拒了,那时候的自己还没意识到,现在的就业行情已经到了要跟公司表衷心的地步了(叹气

2.4 Applied Intuition

这家做自动驾驶simulation的,似乎近几年已经有盈利了。朋友的朋友内推不久之后就reachout了。先是hr跟我讨论了合适的岗位,我之前在国内自驾公司的地图组,所以想着能不能去他们的地图组,但是他们地图算法组需要公民/绿卡,所以就给我安排了类似于地图产线组(就是那些automation pipeline组)的面试

  • 一面:
    • 问了问简历,他们不是算法团队,但是也跟我聊了很多slam方面的东西,算是有来有回
    • coding:非常基础的字典基本操作,外加字符串的操作,感觉都不算是lc题目
  • 二面:忘记了,但应该不难,也很快过了
  • Virtual Onsite:
    • VO1: bfs,求到地图上好几个点的距离和最短路径,followup是uniform cost search
    • VO2: 类似于graphics的状态更新和碰撞检测,给你一个点的位置,heading,speed和yawrate,怎么更新位置。需要自己设计类来描述上述信息,并且进行状态更新(即更新点的位置)。如果这个物体还有半径,然后碰撞检测。说完思路之后,写了写api但是没写完。这里本来题目会更复杂的,比如这个物体不是圆,而是长方形,这样的碰撞检测就会更复杂。我没有做过类似的东西,所以表现一般
    • VO3: system design。我以为ng岗位不会有system design没想到还是碰到了。问题是让我设计一条地图的产线pipeline,我不是搞这些的,自己即没有做过也没有专门准备过system design。我硬着头皮跟面试官复述了前司的地图产线pipeline的大致结构,甚至描述了数据存储geojson的内容。跟面试官聊了很多,包括如何进行地图query,如何对地图进行切分,这些我也尽我所能地复述了前司的一些做法。

结果:reject,说实话有点可惜,面试过程跟面试官聊的还挺通常的,可能不是他们想要的答案吧。我早就跟他们说我是算法的,前面电面一直给我过让我误以为他们挺需要我这个背景的,如果按照前两面标准,vo应该是可以过的。但最后拒了也只能自我安慰确实不match

2.5 Matician

湾区一家机器人公司,岗位就是做slam定位的应该。

  • 一面:
    • 给你一个数据流,一直给系统输入新的数据,要求随时调用你的api能够随时用O(1)的时间算出均值和平方差。均值好办,variance的话其实就是variance = E(x^2) - E(x)^2的应用。你的数据结构里面存三个东西,当前的E(x),当前的E(x^2)和当前已经收到的数据数量n。每次输入进一个新的数据,你都依据n,立马更新E(x),E(x^2),这些都是O(1)的,然后每次调用你的api套用公式即可
    • 采样:你可以有一个均匀采样的函数,如何实现在一个圆里面均匀采样点。我先说了一个拒绝采样的方式,即在这个圆的bounding box里面均匀采样,分别对x和y坐标采样,这样在这个正方形里面的点是均匀的,然后如果你采样的点如果在圆里面的话就接受,如果在圆外面的话就接着再重复上述步骤直到这个点在圆里面。面试官不满意这个答案,想让我用一些构造的方式实现,当时思路有点受限,加上面试官不太给提示,当场没能顺利的做出来,只说了如果用极坐标的话可能可以有一些方式可以构造。(面试完之后我自己仔细想了一下,确实可以用极坐标的方式构造,(r,angle),angle可以直接用均匀分布,半径r的话需要在用均匀分布拿到数字之后再次开根号,算出来的结果作为r。我的具体的思路是我们需要保证每个点的周围小领域是均匀的,即你的采样要在圆里的每个地方的小区域是constant,对于极坐标来说这个小区域的面积为$r\Delta\theta\Delta r$,如果你直接让均匀采样的结果作为theta和r的值,这个面积会跟半径有关系,不会是constant,所以你需要将均匀采样的结果i再开根号,你会发现这样的话会消去那个r,从而变成constant)

结果:reject,后面那个采样问题面试官一直不肯放过我,说了一些这种问题的思路,但是没能答出具体的结果,也接受吧

2.6 Arista Networks

一家做网络的老公司了,学校的career fair投的,后面reachout我,这个主要是c/c++的岗位。室友靠着python拿到了offer,我想着自己c/c++怎么都要比python熟悉,尽管难也选择报说自己会c/c++

  • 一面:
    • c和操作系统的一些基础:控制符输出,主要就是c的string其实就是一个const的char的pointer,所以在打印的时候%s和%d分别是打印出字符串和地址。还借题发挥问我一些access invalid的memory导致的segmentation fault具体流程是什么。也回答出来了,是操作系统那一套,因为c这种底层的语言,你甚至可以乱给个地址,然后*p这样去access这个地址里的内容。如果这块内存如果没跟os申请或者权限错误的话就会报错,具体流程是你的address是virtual address,cpu里面会有个硬件单元MMU来做virtual memory到physical memory的转换,依据就是每个进程自己的page table,但是你access的这块内存根本没有申请过,所以page table的这个entry是空的,这算是page fault那么它就会trap进os kernel里面。在kernel里,os会尝试帮你解决page fault,主要依据是每个进程都会有个linked list存放着所有声明的虚拟内存的信息memory map(包括读写权限之类的),如果在这个map里面也没有说你声明有这块内存,或者是你并不具有相对应的权限,那么就会直接报segmentation fault;如果这个map里面有这个内存的信息,那么它就可能会帮进行一些操作,诸如将文件从disk拷贝到memory,或者是帮你申请一个heap的page等等,然后再正常返回。
    • lc题:实现BST的find previous node,find subtree max的函数,这两个都可以分情况讨论出来,然后用这两个函数实现in-order遍历,其实就是用find_max之后一直find_pre
  • 二面:
    • 整个面试围绕用c++实现一个stack数据结构展开,我需要用泛型编程
      • 先讨论实现可能的方案:linked list或者是自己拿一个数组,记录最后一个栈尾所在的位置
      • 问:这两个方法的复杂度? 答:都可以算是O(1)的,linked list自然不用说,对于第二种来说,在数组需要扩列的时候,即resize的时候会消耗n,但是平均下来amortized的复杂度其实是O(1)的
      • 问:实际应用当中这两个哪个要更快?答:我觉得应该是第二种方式,这里有很多可以说。linked list需要为每个值多增加一个指针的消耗,而数组方法不需要。其次,数组是连续内存,它只需要在resize的时候调用一次malloc/new,而linked list每次新增加一个值都需要调用malloc/new,这种申请的函数是需要trap进os里面的,相对来说要花更久的时间
      • 开始写实现代码实现方法2,吐槽一下,这家居然是在vim上写代码。需要用template泛型编程,写完大致的代码之后就开始了各种优化
      • 问:new和malloc有什么区别?你为什么用new。答:malloc只会申请内存,new是会做初始化的,即调用constructor。这里确实可以用malloc替换,因为我们不需要默认的初始值,我们需要原来的数组的值拷贝过来
      • 问:你知道exception safe吗?(最后5-10分钟)这个时候我还没这个概念,不知道exception safe是个专门的topic,我就回答说如果你想保证exception safe的话,你可以给整个block加个try catch,这里只会有new这种函数的会有exception。但是面试官不太满意这个答案,我后面去专门看了c++的这个exception safe的话题才明天他想聊啥。exception safe是一种method实现的时候的要求,就是当你的method崩溃时,你需要保证你的class的内部成员都是有效的,且没有内存泄漏,可以接着使用(reenter)。在我这里最关键的就是这个栈尾的位置,这个值我是最开始加的,然后再去进行resize之类的操作,实际上是不太好的,因为当申请内存的时候如果报错,那么你这个栈尾已经就更改了(除非用try catch去改,但不让用呀),所以exception safe的push的写法应该是这样的,这样的话是不需要主动的try catch的,因为即使报错也不会损坏class结构(其实还可以再优化,就是改用realloc,这个函数是为一块区域resize,如果这块内存后面有充足的连续内存,那么就直接在尾部增加,这样的话是不需要copy的;如果没有充足的连续内存的话,就会再给你找一块新的内存,这样的话就需要copy
void push(int value) {
if table is full:
new placement larger memory
push the value
last_index++
}
结果:当场reject,最后的5-10分钟可以说是噩梦,一个topic不知道就挂了,最后那几分钟一直在看面试官秀操作,确实对于c++的东西非常了解也操作细微,连哪两句互换顺序也有讲究。我在完整看完effective c++之后才发现exception safe确实是一个大的topic。这是又一次距离offer很近的一次,也无可奈何。

2.7 Zipline

做无人机送快递的公司,是他们的定位组

  • 一面:是manager的简历面,主要对着我的简历问我vSLAM相关的经历,聊的还不错
  • take home challenge:一道lc题目,给定一个2D矩阵(你可以想象成一个grey image)和一个pattern(也是2D矩阵,但是要更小一点),在大的image当中找到最左上角的patter的位置(可以理解为最朴素的pattern matching),没想出什么好的办法就直接暴力搜索了

结果:reject。应该是那个challenge有更好的办法,但是没能想出来,自己也大意了

2.8 WeRide

文远智行,跟我前司感觉差不多量级的公司。这次面的是地图组,也跟我我在国内的前司所在组一样。

195条回复