今年 Apple Intern 发面试真的很多,但我还是看到一部分同学连 OA 都没有。 我个人判断很大概率是简历问题。众所周知每家大厂简历偏好都不一样,没被捞先看看你项目是不是不符合谷歌风格。 这篇 Apple Intern面经 依然是原创真实面经,不是那种地里拿出来再改编的。
Apple Intern面经
OOD
我们要用面向对象的方式来设计一个停车场系统。 这个停车场呢,不是只有一层,而是有好几层。每一层里面,又分成一排一排的停车位。停车场要能停不同类型的车,比如:摩托车,小汽车,公交车。然后这个系统要具备两个核心功能:能查到一辆车停在哪一层、哪一个位置,车开走的时候,能自动算出该交多少钱停车费。
思路:停车场系统包含以下核心类:
- Vehicle(车辆基类):定义通用车辆属性
- Motorcycle, Car, Bus(具体车辆类):继承自Vehicle
- ParkingSpot(停车位):记录车位信息
- Level(楼层):管理每层的车位
- ParkingGarage(停车场):整个停车场的总管理
Code
题目:给 a[0]…a[N-1],找 i<=j 且 a[i]=a[j],使得子数组和 a[i]+…+a[j] 最大。
这题看着像“找相同值的两端”,但核心其实是:固定右端 j 时,想让 sum(i..j) 最大,就要让 prefix[i] 尽量小(因为 sum = prefix[j+1] – prefix[i]),并且 a[i] 必须等于 a[j]。所以我会做两件事,先用前缀和 pref[k] = a[0]+…+a[k-1],对每个值 v,维护一个“目前为止出现过 v 的位置里,最小的 pref[i](以及对应下标 i),
当我扫到某个 j(值是 v):先把当前的 pref[j] 拿去更新 v 的最小前缀(这一步也覆盖 i=j 的情况),然后算候选答案:pref[j+1] - minPref[v],更新全局最大值,同时记录 i、j。
解法
数据结构:HashMap(value -> (minPrefix, minIndex)),minPrefix:该 value 作为左端点时,能拿到的最小 pref[i],minIndex:对应的 i,用来最后返回区间。
时间复杂度: O(N)(扫一遍,每步 hashmap 操作),空间复杂度: O(U)(U 是不同数字的数量)
Follow-up 1:如果要求 i < j(不允许单个元素)怎么办?
很简单:更新答案时加个判断 i < j,或者初始化 min_pref 的时机改成“先算候选,再把 j 放进去”,
保证左端一定在右端之前。
Follow-up 2:如果要返回“最大和对应的所有区间”,或者 tie-break(比如和相同取最短 / 最早)?
tie-break 规则写进更新逻辑:和相同:比较长度 (j – i),还相同:比较 i 更小,如果要返回所有区间:需要在 map 里保留“同样最小 pref 的多个 i”(但一般面试不会真让你返回全部,更多是考你怎么定义 tie-break)。
Code + 八股
Apple intern除了考Code,有时候还会八股+Code一起考试,八股主要围绕着操作系统,问了 C 里面的 volatile 关键字,virtual memory的原理,死锁的原理。
Code: 实现一个 hash table。支持插入查找删除。这种面试官有一个特点,喜欢 micro management,比如敲到一半儿给你个 hint,说不要你这么敲要你那么敲。我们只能顺着面试官,否则面试官很可能开始跟你 battle,用一个冲突的视角看到你的方法,算是人之常情,但我们要避免这个麻烦。
BQ:Out of your comfort zone, tight ddl, can not meet your commitment, 如何和 customer 交流。
准备小结
如果你也在准备 Apple Intern 或其他大厂的 OA/VO,可以直接联系 programhelp 了解对应的面试辅助和陪跑支持。如果你想找我辅助面试,或者用 Apple intern面经 中的原题 mock,感受最真实的 feedback,欢迎戳我。
全网唯一一家支持 L6 以上 system design mock,只放真实面经。
求职辅助服务,是关于时间和品质的较量。咨询Programhelp,获取最专业的Tech求职辅助。