本文内容截取自《阿里云技术面试红宝书》
阿里云技术面试官面试真题和题解,助你拿下Offer!

1. 举一个数据库快照读的实现方案
参考答案:本题考察候选人对于基于时间戳的常见快照读的实现和一般 MVCC 机制的理解
2. B+ 树和 B 树的区别有哪些?
参考答案:本题考察候选人对数据库中经典数据结构的细节掌握度,以及常见的数据库扫描方法的理解程度
3. 编程实现 DAG(有向无环图)的 DeepCopy
这是一道编程题目,结合了数据结构和简单算法(如递归等)。
考察点:
-
候选人应该明确什么是 DeepCopy 并主动沟通
-
候选人应该清楚的定义数据结构
这个问题里面,需要定义节点,节点只要有 {value, Collection neighbors} 就可以了,增加别的成员一般是不合理的。
候选人应该意识到需要定义数据结构,如果不清楚定义(是个扣分项)需要提醒候选人。
图的话可以不定义单独的数据结构,有 Collection 所有节点集合就可以了。当然专门定义也可以。
有的候选人会有 Collection 和 Collection 定义(Node 里面没有 edge),或者有的候选人用二维链接矩阵,这也 OK。
数据结构定义合理性检查:例如包含一些算法需要的 mutable variable 在数据结构里面,破坏结构定义封装以及 immutability 和 thread safety 的话,对于有经验的候选人是个比较大的减分项,对于学生一般是 OK 的。 -
编程实现
一般来说比较方便的是用递归 /DFS 实现,候选人也可以选择其他算法(如 BFS)。
以 Java 为例:
public static Collection<Node> DeepCopy(Collection<Node> nodes) {
Collection<Node> newNodes = new ArrayList<>();
Map<Node, Node> copyMap = new HashMap<>();
for (Node node : nodes) {
newNodes.add(copyNode(node, copyMap));
}
return newNodes;
}
private Node copyNode(Node node, Map<Node, Node> copyMap) {
if (copyMap.containsKey(node)) {
return copyMap.get(node); // 可以加上 nullability check
}
Collection<Node> newNeighbors = new ArrayList<>();
for (Node neighbor : node.getNeighbors()) {
newNeighbors.add(copyNode(neighbor, copyMap));
}
Node newNode = new Node(node.getValue(), newNeighbors);
copyMap.put(node, newNode);
return newNode;
}
- 其他
这个编程的过程,经常出现的是递归的方法和 wrapper 方法之间划分不清,出现大量的重复代码,候选人这里花多少时间解决也是一个能力的表现。
还有经常有候选人意识不到 DeepCopy 里面需要保持图的结构因此想不到用 Map,这个也是不行的。当然如果要求不高,可以直接把题目编程 DeepCopy 一个树,这样就没有去重的需求了。
能够正确完成的,可以 follow up:如线程安全,问一下候选人方法是否是线程安全的(如果在 Node 节点里面存一些临时变量,或者把 Map 作为全局变量等就不是了),可以问如何改造成线程安全之类的问题。
另外 Follow up Big(O):时间复杂度(O(V) + O(E))
4. 设计一个抽奖,假定只有非常有限的内存,如何处理一个无限的样本流?
问题:设计一个抽奖,假定只有非常有限的内存,处理一个无限的样本流,任何时候都能提供出 N 个中奖的样本,而且所有已经遇到的样本的几率一样
该问题比较适合:(1)需要考察设计的;(2)有一定的统计的背景,即便不了解reservoir sampling 也可以自己去推理。
如果不熟悉这个算法没关系,候选人完全可以通过自己的思路去推演这个设计,不要求做出来,只是系统设计的思路。
5.如果 Java 程序 CPU 飚高到 100%,怎么排查原因?
考察点:系统运维的能力,常见命令的使用。
思路:Top -H 查看 CPU 飚高的线程,jstack 看看线程所在的 Stack 来分析问题。
6. 多租户隔离是什么?解决哪些问题?多租户的架构是怎么样的?
考察点:面向企业场景的安全、高可用能力
思路:多租户分为逻辑隔离和物理隔离,解决的是企业数据安全和高可用的问题,可
以从分布式切片的角度和统一路由的角度来回答该问题。
7. 图的基础概念以及基础数据结构。
已知有 5 个城市,现需要在城市间搭建通信电缆,各个城市间的造价如下,求最小造价。

考察点:图的基础概念以及基础数据结构,得到最小生成树的经典方法
参考答案:
Prim’s algorithm 普林演算法(贪心算法):

C++ 实现:

8. 请实现代码片段,把地址 0x80008000 处的 32 位数据的第 10 位开始的 7 位设置为 0xAA。
考察点:
- 对 C 的位运数的理解
- 对绝对地址访问的理解
答案:
unsigned int tmp;
tmp = *(volatile unsigned int *)0x80008000;
tmp = (tmp & (~(0xff<<10))) | (0xAA << 10);
*(volatile unsigned int *)0x80008000 = tmp;
9. 设计和编码实现一个具备 LRU 过期策略的缓存程序。
本题考察对 java 基础能力,对 HashMap 熟悉程度.
答案:
public class LRUMap<K,V> extends LinkedHashMap<K,V>
{
protected final int _maxEntries;
public LRUMap( int maxEntries)
{
this(16, maxEntries);
}
public LRUMap(int initialEntries, int maxEntries)
{
super(initialEntries, 0.8f, true);
_maxEntries = maxEntries;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K,V> eldest)
{
return size() > _maxEntries;
}
}
10. 一个云端应用部署会涉及到哪几类配置信息?
答案:1. 基础设施配置;2. 部署配置;3. BaaS 服务配
更多相关文章:




