面经|亚马逊|社招|全流程分享
11661
2022.05.25
发布于 未知归属地

背景

楼主本硕都是天坑专业,硕2才开始自学编程,工作快3年,最近拿到了中国亚麻的offer,分享一下亚麻的社招面经
我最终的级别是sde1(虽然投递的是sde2,但是很遗憾在系统设计上没有发挥好,没能拿到sde2)


面试流程

我的亚麻面试的整个流程包括简历投递、OA、loop面、沟通offer四个环节
其中OA是全英文,loop面都是中文面试

简历投递

简历投递有2种途径

  1. 亚马逊的官网投递
  2. 找人内推简历

这里我推荐第二种,通常内推的岗位就是正在招人的岗位,同时内推的人也会帮你追踪面试过程,比起自己盲目投递要靠谱一些

在线测试 online assessment

我是在内推之后1个星期左右收到OA的邮件的
OA有3部分,都是全英文的

  1. 在线编程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上一道原题,针对每一个数分别统计它作为子数组最大数、最小数出现多少次,用单调栈
  2. 工程管理测试
    工作内容测试全部都是选择题,我遇到了2种类型的场景,分别举个例子
    • 你得知公司接到了一个线上的直播演唱会的需求,需要你去承接这个任务,如果是你,你接下来会做什么?
      1、制作方案,联系人员进行方案评审
      2、代码编写、联调测试
      3、监控系统搭建
      4、找客户详细了解需求背景,确认需求
      这种题目是单选题,这种就比较好选择
    • 你需要设计一个监控系统,以下组件的优先级排序
      1、kv数据库
      2、关系型数据库
      3、图数据库
      4、消息队列
      5、hbase
      6、hadoop
      这类题需要你对每个组件的重要程度打分,考察你对一些中间件的基本认知
  3. 性格测试
    这类问题没啥好说的

loop面

  • 在loop面之前一般会有电话面试,但是楼主没有,事后得知应该是我OA的编程题都是100%过,免去了电话面环节
  • 同时在loop面之前会收到邮件,让你给出可以面试的时间,hr再去约面试官,这里建议大家不要把4轮loop面安排在1天, 因为真的会很累,影响自己的发挥

楼主是在OA之后1周左右收到hr邮件约loop面试时间,真正loop面时间距离这封邮件应该有差不多一个月的时间

loop面分为4轮,2轮面试是在线coding,2轮面试是系统设计,当然每一轮面试开始前都会自我介绍,并描述项目,针对项目问些问题。
同时每轮面试可能会夹杂着问你一些behavior question,这里大家可以自己搜索一下关于亚麻bq的一些问题

  1. 系统设计面试,关于系统设计,我觉得可以去了解分布式id生成、短链、feed流、微博、微信红包、在线聊天系统、日志、监控系统、直播弹幕系统等这些系统设计,网上会有一些资料,但是也要自己思考如果是自己设计,会怎么设计,着重点在于 需求分析、存储设计、服务拆分、后续监控维护,注意如何保证系统的高性能、高可用、扩展性(当然楼主好像没资格在这里说教,因为面得不好)

  2. 在线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基础,也对转行比较迷茫,也是一步一步刷过来的,在平常也看到很多同学发帖吐槽题目难刷,想放弃,分享一下自身经历和大家共勉

评论 (33)