背景
楼主本硕都是天坑专业,硕2才开始自学编程,工作快3年,最近拿到了中国亚麻的offer,分享一下亚麻的社招面经
我最终的级别是sde1(虽然投递的是sde2,但是很遗憾在系统设计上没有发挥好,没能拿到sde2)
面试流程
我的亚麻面试的整个流程包括简历投递、OA、loop面、沟通offer四个环节
其中OA是全英文,loop面都是中文面试
简历投递
简历投递有2种途径
- 亚马逊的官网投递
- 找人内推简历
这里我推荐第二种,通常内推的岗位就是正在招人的岗位,同时内推的人也会帮你追踪面试过程,比起自己盲目投递要靠谱一些
在线测试 online assessment
我是在内推之后1个星期左右收到OA的邮件的
OA有3部分,都是全英文的
- 在线编程2道题目
- 第一题:给定一个单链表,节点个数是偶数n,求 max(e[i]+e[n-1-i]), 比如 4-5-1-3-6-7, 结果就是max(4+7,5+6,1+3) = 4+7 = 11, 但是题目要求是用o(n)时间复杂度,o(1)空间复杂度
思路: (这道题我卡了很久怎么才能在o(1)空间复杂度完成)最后思路将链表的后一半翻转,然后2个指针遍历 - 第二题:给定一个数组求这个数组所有子数组中的最大值与最小值差值之和, 比如[1,3,2] 一共有6个子数组,其中每一个子数组最大值与最小值的差 如下:
[1] 最大值是1,最小值是1,则差值1-1=0
[1,3] 3 - 1 = 2
[1,3,2] 3 - 1 = 2
[3] 3 - 3 = 0
[3,2] 3 - 2 = 1
[2] 2 - 2 = 0
总计 0+2+2+0+1+0 = 5
思路:这应该是leetcode上一道原题,针对每一个数分别统计它作为子数组最大数、最小数出现多少次,用单调栈
- 第一题:给定一个单链表,节点个数是偶数n,求 max(e[i]+e[n-1-i]), 比如 4-5-1-3-6-7, 结果就是max(4+7,5+6,1+3) = 4+7 = 11, 但是题目要求是用o(n)时间复杂度,o(1)空间复杂度
- 工程管理测试
工作内容测试全部都是选择题,我遇到了2种类型的场景,分别举个例子- 你得知公司接到了一个线上的直播演唱会的需求,需要你去承接这个任务,如果是你,你接下来会做什么?
1、制作方案,联系人员进行方案评审
2、代码编写、联调测试
3、监控系统搭建
4、找客户详细了解需求背景,确认需求
这种题目是单选题,这种就比较好选择 - 你需要设计一个监控系统,以下组件的优先级排序
1、kv数据库
2、关系型数据库
3、图数据库
4、消息队列
5、hbase
6、hadoop
这类题需要你对每个组件的重要程度打分,考察你对一些中间件的基本认知
- 你得知公司接到了一个线上的直播演唱会的需求,需要你去承接这个任务,如果是你,你接下来会做什么?
- 性格测试
这类问题没啥好说的
loop面
- 在loop面之前一般会有电话面试,但是楼主没有,事后得知应该是我OA的编程题都是100%过,免去了电话面环节
- 同时在loop面之前会收到邮件,让你给出可以面试的时间,hr再去约面试官,这里建议大家不要把4轮loop面安排在1天, 因为真的会很累,影响自己的发挥
楼主是在OA之后1周左右收到hr邮件约loop面试时间,真正loop面时间距离这封邮件应该有差不多一个月的时间
loop面分为4轮,2轮面试是在线coding,2轮面试是系统设计,当然每一轮面试开始前都会自我介绍,并描述项目,针对项目问些问题。
同时每轮面试可能会夹杂着问你一些behavior question,这里大家可以自己搜索一下关于亚麻bq的一些问题
-
系统设计面试,关于系统设计,我觉得可以去了解分布式id生成、短链、feed流、微博、微信红包、在线聊天系统、日志、监控系统、直播弹幕系统等这些系统设计,网上会有一些资料,但是也要自己思考如果是自己设计,会怎么设计,着重点在于 需求分析、存储设计、服务拆分、后续监控维护,注意如何保证系统的高性能、高可用、扩展性(当然楼主好像没资格在这里说教,因为面得不好)
-
在线coding
在线coding需要先和面试官确认好题目的意思,进而讲解自己的思路,在写代码的过程中也要描述细节,最后整体讲解一遍,给出时空复杂度,这里注意一下,以前楼主一般不会将函数的递归调用算进空间复杂度里面,之前被字节坑过,因此在讲解的时候都会说明一下
-
题目1:给你2个有序单链表,合并成一个链表,写出来之后又追加如果是n个有序链表,该如何合并
2个链表合并,直接递归合并,n个有序链表楼主刚开始答的是小顶堆,后来又答可以像合并2个链表一样依次合并,最终优化成归并合并:将n个链表分成2个n/2的链表处理 -
题目2:给定一个无序数组,删除中间一个子数组,剩余数组前后拼接成一个非递减的数组,求剩余这个数组的最大长度
这道题事后发现也leetcode上的原题,楼主当时是二分做的,先分别抠出原数组左右2边非递减的数组,针对这2个数组看怎么取舍合并
我还问面试官有没有o(n)的做法,面试官居然说他没想到,事后发现可以对左右2边的数组用双指针,做到o(n) -
题目3:二叉树删除一些节点,会形成很多个二叉树组成一个森林,给定一个二叉树和需要删除的节点,返回最终森林里每一个树的根节点的list
楼主的做法:遍历每一个节点,判断 当前节点和它的父节点的删除状态
dfs函数定义如下: leftOrRight表示当前节点是父节点的左孩子还是右孩子void dfs(TreeNode father, TreeNode current, int leftOrRight)一共四种状态,针对每一种状态决定是否添加当前节点至结果list里面
1、当前节点和父节点都没删除
2、都删除
3、当前节点删除 父节点不删除
4、当前节点不删除,父节点删除
-
offer
在整个面试完成之后2天收到hr电话,说过了
总结
我在研二18年才接触到leetcode,当时还没有中国区,之前都是在美国区刷题(在美国区刷题也锻炼我的英文读题能力),当时我还是个计算机小白,还在自学java基础,也对转行比较迷茫,也是一步一步刷过来的,在平常也看到很多同学发帖吐槽题目难刷,想放弃,分享一下自身经历和大家共勉





