1月11号去西雅图总部面的。1月16号星期一收到的感谢信,虽然跪了,还是写下来吧。
因为签了保密协议,又因为很多阿三会找我们的面经,所以代码和描述都是取近义,尽量给后来的同学讲明白。
新盖的楼,叫"Day 1",听说是取自CEO的一句名言。
头一天晚上去踩了个点,从住的酒店到大楼最多10分钟。
我是提前半个小时到的,看着公司的人进进出出就也就没这么紧张。
几个之后的同学问到的问题:
- 保密协议到前台也可以签,不想自己打印的可以直接到公司签。
- 不用存包,带着自己的包上去。
- 手机会要求你关掉。
- 提供早餐和午餐,食物是能量,能吃就吃。
基本是三个人一个组,在recruiter唠叨半天之后,开始进入面试正题。
第一题
每个组会得到一个问题,每个组员会拿到同一个问题的不同解决方案。小组讨论每个人的解法有什么优缺点,分析时间复杂度,然后给三个解法排个序,哪个相对来说最好,哪个相对来说最不好。(根据地里面经,一般都是 2 > 1 > 3)一共好像是15分钟。包括讨论和跟一起跟面试官交流。
我们组抽到的是【排名前M】的那道题。这道题LeetCode上有,大家都应该做过。
注意仔细审题
题目要求 只考虑时间复杂度,不考虑空间复杂度,不用优化。但是面试官会要求小组提出优化的大概方向。
三个不同的解法。
第一个是暴力,不多说。
第二个,也就是我拿到的解法, 快速选择 。
第三个是用 优先队列,也不用多说。
第二个解法其实是不完整的代码,缺少递归的部分。(不知道我说啥的同学,按照上面三个解法把原题做一遍就知道了,这里就不贴代码了。)
不完整的代码是肯定垫底的。
然后排序完之后,会给面试官确认。面试官一般都会问问优化的问题。注意表现出领导力,这是亚麻看重的地方(带着其他人审题,分析代码什么的)
第二题
这就是传说中的送货问题。(代码在最后,百度云,密码是:k四五六(换成阿拉伯数字即可))
Tips:在写代码中途会有一个30分钟的一对一interview。主要是讲第一小题的解法和第二小题的思路和实现所用的数据结构。自己去选择自己的时间段(一共有4个时间段可以选),我建议选择第二个时间段,当时我就选的第三个时间段,结果轮到我的时候,我基本上都写完了……
把每一道题的时间复杂度分析清楚,因为在提交代码之后还会有一轮15分钟的interview,就会让你解释每个解法的时间复杂度。
题目背景大概如下:(建议配合代码一起看,上传的是Java的版本)
公司的主要业务就是淘宝。那么淘宝就需要送货。从用户下订单到送货,有很多因素需要考虑(库存量,库存所在地,收货地区,运费等等)。
每天公司都会产生很多的订单,每一个订单对应只有一个商品(一个商品ID),而公司在全国几个大的地区都有设置仓库。仓库里有商品,每个商品有不同的ID唯一识别。另外,每个仓库都有能从自己的所在地运送到其他地区的费用和方式。
三个小题:
- 给定 一个商品ID 和一个 目的地,返回所有对应这个商品的库存 和 运送花费。
- 给定一个订单的列表,要么满足运送最多的订单,要么满足最小化迟到的订单(尽量在用户预期时间内送到)
- 跟第二小题一样的输入,满足平均每单运费最小。
在第二小题和第三小题中,只需要完成核心的算法代码部分,输入和输出都不用担心,并且在运行主函数的时候,会有百分比打印在console上。
我第三小题没有做,但是在第二小题里,基本把第三小题也做了,结果记得是91%的fulfill orders,30%的ontime order,$4的average shipping cost
题目本身并不难,而且也并不需要很复杂的实现,什么树,什么图都用不着,要么排序,要么用优先队列。主要考虑的是很多edge cases和优化。
- 对于第一小题的建议是,先写暴力的方法(两个for循环嵌套),等出去一对一的时候,就可以让面试官问优化的事,然后一秒钟答上用HashMap。让面试官感觉你反应很快。
- 对于第二小题,见仁见智,反正写出的算法合理并且复杂度不要太高就行。
- 对于第三小题,对shippingcost排个序,然后想想优化就行了。
为什么不多说,是因为亚麻考这题就是看每个人的思路,说的细致了就给大家有了先入为主的框架,想edge case就不好想了,另外每个人的解法都不一样,如果能有用树或者图,面试官同意,在2个小时左右能够写出完整代码的话,也是可以的,反正我是没有想到……
链接:http://pan.baidu.com/s/1i48itBB