Skip to content

Commit 41b3343

Browse files
committed
revert latest push
1 parent 280e8d5 commit 41b3343

File tree

144 files changed

+2669
-28
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

144 files changed

+2669
-28
lines changed

01.阿里篇/.gitkeep

Whitespace-only changes.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
##### **问题**:如何实现一个高效的单向链表逆序输出?
2+
3+
##### **出题人**:阿里巴巴出题专家:昀龙/阿里云弹性人工智能负责人
4+
5+
##### **参考答案**:下面是其中一种写法,也可以有不同的写法,比如递归等。供参考。
6+
7+
8+
```
9+
typedef struct node{
10+
int data;
11+
struct node* next;
12+
node(int d):data(d), next(NULL){}
13+
}node;
14+
15+
void reverse(node* head)
16+
{
17+
if(NULL == head || NULL == head->next){
18+
return;
19+
}
20+
21+
node* prev=NULL;
22+
node* pcur=head->next;
23+
node* next;
24+
25+
while(pcur!=NULL){
26+
if(pcur->next==NULL){
27+
pcur->next=prev;
28+
break;
29+
}
30+
next=pcur->next;
31+
pcur->next=prev;
32+
prev=pcur;
33+
pcur=next;
34+
}
35+
36+
head->next=pcur;
37+
node*tmp=head->next;
38+
while(tmp!=NULL){
39+
cout<<tmp->data<<"\t";
40+
tmp=tmp->next;
41+
}
42+
}
43+
44+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#### **题目**:已知 sqrt (2)约等于 1.414,要求不用数学库,求 sqrt (2)精确到小数点后 10 位。
2+
#### **出题人**:——阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家
3+
#### **参考答案**
4+
#### * 考察点
5+
6+
1. 基础算法的灵活应用能力(二分法学过数据结构的同学都知道,但不一定往这个方向考虑;如果学过数值计算的同学,应该还要能想到牛顿迭代法并解释清楚)
7+
2. 退出条件设计
8+
9+
#### 二分法
10+
##### 1. 已知 sqrt(2)约等于 1.414,那么就可以在(1.4, 1.5)区间做二分
11+
查找,如:
12+
a) high=>1.5
13+
b) low=>1.4
14+
c) mid => (high+low)/2=1.45
15+
d) 1.45*1.45>2 ? high=>1.45 : low => 1.45
16+
e) 循环到 c)
17+
18+
##### 2. 退出条件
19+
a) 前后两次的差值的绝对值<=0.0000000001, 则可退出
20+
21+
```
22+
const double EPSILON = 0.0000000001;
23+
24+
double sqrt2() {
25+
double low = 1.4, high = 1.5;
26+
double mid = (low + high) / 2;
27+
28+
while (high - low > EPSILON) {
29+
if (mid * mid > 2) {
30+
high = mid;
31+
} else {
32+
low = mid;
33+
}
34+
mid = (high + low) / 2;
35+
}
36+
37+
return mid;
38+
}
39+
```
40+
41+
#### 牛顿迭代法
42+
##### 1.牛顿迭代法的公式为:
43+
x<sub>n+1</sub> = x<sub>n</sub>-f(x<sub>n</sub>)/f'(x<sub>n</sub>)
44+
45+
对于本题,需要求解的问题为:f(x)=x<sup>2</sup>-2 的零点
46+
```
47+
EPSILON = 0.1 ** 10
48+
def newton(x):
49+
if abs(x ** 2 - 2) > EPSILON:
50+
return newton(x - (x ** 2 - 2) / (2 * x))
51+
else:
52+
return x
53+
```
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
#### **题目**:给定一个二叉搜索树(BST),找到树中第 K 小的节点。
2+
#### **出题人**:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家
3+
#### **参考答案**
4+
5+
##### * 考察点
6+
1. 基础数据结构的理解和编码能力
7+
2. 递归使用
8+
9+
##### * 示例
10+
```
11+
5
12+
/ \
13+
3 6
14+
/ \
15+
2 4
16+
/
17+
1
18+
19+
```
20+
说明:保证输入的 K 满足 1<=K<=(节点数目)
21+
22+
树相关的题目,第一眼就想到递归求解,左右子树分别遍历。联想到二叉搜索树的性质,root 大于左子树,小于右子树,如果左子树的节点数目等于 K-1,那么 root 就是结果,否则如果左子树节点数目小于 K-1,那么结果必然在右子树,否则就在左子树。因此在搜索的时候同时返回节点数目,跟 K 做对比,就能得出结果了。
23+
24+
```
25+
/**
26+
* Definition for a binary tree node.
27+
**/
28+
29+
public class TreeNode {
30+
int val;
31+
TreeNode left;
32+
TreeNode right;
33+
TreeNode(int x) { val = x; }
34+
}
35+
36+
class Solution {
37+
private class ResultType {
38+
39+
boolean found; // 是否找到
40+
41+
int val; // 节点数目
42+
ResultType(boolean found, int val) {
43+
this.found = found;
44+
this.val = val;
45+
}
46+
}
47+
48+
public int kthSmallest(TreeNode root, int k) {
49+
return kthSmallestHelper(root, k).val;
50+
}
51+
52+
private ResultType kthSmallestHelper(TreeNode root, int k) {
53+
if (root == null) {
54+
return new ResultType(false, 0);
55+
}
56+
57+
ResultType left = kthSmallestHelper(root.left, k);
58+
59+
// 左子树找到,直接返回
60+
if (left.found) {
61+
return new ResultType(true, left.val);
62+
}
63+
64+
// 左子树的节点数目 = K-1,结果为 root 的值
65+
if (k - left.val == 1) {
66+
return new ResultType(true, root.val);
67+
}
68+
69+
// 右子树寻找
70+
ResultType right = kthSmallestHelper(root.right, k - left.val - 1);
71+
if (right.found) {
72+
return new ResultType(true, right.val);
73+
}
74+
75+
// 没找到,返回节点总数
76+
return new ResultType(false, left.val + 1 + right.val);
77+
}
78+
}
79+
80+
```
81+

01.阿里篇/1.1.4 LRU缓存机制.md

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
**题目**:LRU 缓存机制
2+
设计和实现一个 LRU(最近最少使用)缓存数据结构,使它应该支持一下操作:get 和 put。
3+
get(key) - 如果 key 存在于缓存中,则获取 key 的 value(总是正数),否则返回 -1。
4+
put(key,value) - 如果 key 不存在,请设置或插入 value。当缓存达到其容量时,它应该在插入新项目之前使最近最少使用的项目作废。
5+
6+
**出题人**:文景/阿里云 CDN 资深技术专家
7+
8+
**参考答案**
9+
10+
python版本的:
11+
12+
```
13+
class LRUCache(object):
14+
def __init__(self, capacity):
15+
"""
16+
:type capacity: int
17+
"""
18+
self.cache = {}
19+
self.keys = []
20+
self.capacity = capacity
21+
22+
def visit_key(self, key):
23+
if key in self.keys:
24+
self.keys.remove(key)
25+
self.keys.append(key)
26+
27+
def elim_key(self):
28+
key = self.keys[0]
29+
self.keys = self.keys[1:]
30+
del self.cache[key]
31+
32+
def get(self, key):
33+
"""
34+
:type key: int
35+
:rtype: int
36+
"""
37+
if not key in self.cache:
38+
return -1
39+
self.visit_key(key)
40+
return self.cache[key]
41+
42+
def put(self, key, value):
43+
"""
44+
:type key: int
45+
:type value: int
46+
:rtype: void
47+
"""
48+
if not key in self.cache:
49+
if len(self.keys) == self.capacity:
50+
self.elim_key()
51+
self.cache[key] = value
52+
self.visit_key(key)
53+
54+
def main():
55+
s =
56+
[["put","put","get","put","get","put","get","get","get"],[[1,1],[2,2],[1],[3,3],[2],[
57+
4,4],[1],[3],[4]]]
58+
obj = LRUCache(2)
59+
l=[]
60+
for i,c in enumerate(s[0]):
61+
if(c == "get"):
62+
l.append(obj.get(s[1][i][0]))
63+
else:
64+
obj.put(s[1][i][0], s[1][i][1])
65+
print(l)
66+
67+
if __name__ == "__main__":
68+
main()
69+
70+
```
71+
72+
c++版本的:
73+
74+
```
75+
class LRUCache{
76+
public:
77+
LRUCache(int capacity) {
78+
cap = capacity;
79+
}
80+
81+
int get(int key) {
82+
auto it = m.find(key);
83+
if (it == m.end()) return -1;
84+
l.splice(l.begin(), l, it->second);
85+
return it->second->second;
86+
}
87+
88+
void set(int key, int value) {
89+
auto it = m.find(key);
90+
if (it != m.end()) l.erase(it->second);
91+
l.push_front(make_pair(key, value));
92+
m[key] = l.begin();
93+
if (m.size() > cap) {
94+
int k = l.rbegin()->first;
95+
l.pop_back();
96+
m.erase(k);
97+
}
98+
}
99+
}
100+
101+
```
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
##### **问题**:关于 epoll 和 select 的区别,哪些说法是正确的?(多选)
2+
A. epoll 和 select 都是 I/O 多路复用的技术,都可以实现同时监听多个 I/O 事件的状态。
3+
4+
B. epoll 相比 select 效率更高,主要是基于其操作系统支持的I/O事件通知机制,而 select 是基于轮询机制。
5+
6+
C. epoll 支持水平触发和边沿触发两种模式。
7+
8+
D. select 能并行支持 I/O 比较小,且无法修改。
9+
10+
##### **出题人**:阿里巴巴出题专家:寈峰/阿里技术专家
11+
12+
##### **参考答案**:A,B,C
13+
14+
15+
**【延伸】那在高并发的访问下,epoll使用那一种触发方式要高效些?当使用边缘触发的时候要注意些什么东西?**
16+
17+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#### **题目**:从 innodb 的索引结构分析,为什么索引的 key 长度不能太长?
2+
3+
#### **出题人**:阿里巴巴出题专家:近秋/阿里云数据库产品技术部技术专家
4+
5+
#### **参考答案**:key 太长会导致一个页当中能够存放的 key 的数目变少,间接导致索引树的页数目变多,索引层次增加,从而影响整体查询变更的效率。
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#### **题目**:MySQL 的数据如何恢复到任意时间点?
2+
3+
#### **出题人**:阿里巴巴出题专家:近秋/阿里云数据库产品技术部技术专家参考答案
4+
5+
#### **参考答案**:恢复到任意时间点以定时的做全量备份,以及备份增量的 binlog 日志为前提。恢复到任意时间点首先将全量备份恢复之后,再此基础上回放增加的 binlog 直至指定的时间点。
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#### **题目**:NFS 和 SMB 是最常见的两种 NAS(Network Attached Storage)协议,当把一个文件系统同时通过 NFS 和 SMB 协议共享给多个主机访问时,以下哪些说法是错误的:(多选)
2+
3+
A. 不可能有这样的操作,即把一个文件系统同时通过 NFS 和 SMB协议共享给多个主机访问。
4+
5+
B. 主机 a 的用户通过NFS 协议创建的文件或者目录,另一个主机 b的用户不能通过 SMB 协议将其删除。
6+
7+
C. 在同一个目录下,主机 a 通过 NFS 协议看到文件 file.txt,主机b 通过 SMB 协议也看到文件 file.txt,那么它们是同一个文件。
8+
9+
D. 主机 a 通过 NFS 协议,以及主机 b 通过 SMB 协议,都可以通过主机端的数据缓存,提升文件访问性能。
10+
11+
#### **出题人**:阿里巴巴出题专家:起影/阿里云文件存储高级技术专家
12+
13+
#### **参考答案**:A,B,C
14+
15+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#### **题目**:输入 ping IP 后敲回车,发包前会发生什么?
2+
3+
#### **出题人**:阿里巴巴出题专家:怀虎/阿里云云效平台负责人
4+
5+
#### **参考答案**
6+
ping目标ip时,先查路由表,确定出接口
7+
- 如果落在直连接口子网内,此时若为以太网等 _多路访问网络_ 则先查询arp缓存,命中则直接发出,否则在该接口上发arp询问目标ip的mac地址,取得后发出,若为ppp等 _点对点网络_ ,则直接可以发出;
8+
- 如果查表落在缺省路由上,此时若为以太网等 _多路访问网络_ 则先查询网关arp缓存,命中则直接发出,否则在该接口上发arp询问网关的mac地址,取得后发出,若为ppp等 _点对点网络_ ,则直接可以发出;
9+
- 若查表未命中,则返回不可达。
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#### **题目**:请解释下为什么鹿晗发布恋情的时候,微博系统会崩溃,如何解决?
2+
3+
#### **出题人**:阿里巴巴出题专家:江岚/阿里巴巴数据技术高级技术专家
4+
5+
#### **参考答案**
6+
7+
A. 获取微博通过 pull 方式还是 push 方式
8+
9+
B. 发布微博的频率要远小于阅读微博
10+
11+
C. 流量明星的发微博,和普通博主要区分对待,比如在 sharding的时候,也要考虑这个因素
12+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#### **题目**:现有一批邮件需要发送给订阅顾客,且有一个集群(集群的节点数不定,会动态扩容缩容)来负责具体的邮件发送任务,如何让系统尽快地完成发送?请详述技术方案!
2+
3+
#### **出题人**:阿里巴巴出题专家:江岚/阿里巴巴数据技术高级技术专家
4+
5+
### **参考答案**
6+
7+
A. 借助消息中间件,通过发布者订阅者模式来进行任务分配
8+
9+
B. master-slave 部署,由 master 来分配任务
10+
11+
C. 不借助任何中间件,且所有节点均等。通过数据库的 update-returning,从而实现节点之间任务的互斥
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#### **题目**:有一批气象观测站,现需要获取这些站点的观测数据,并存储到 Hive 中。但是气象局只提供了 api 查询,每次只能查询单个观测点。那么如果能够方便快速地获取到所有的观测点的数据?
2+
3+
#### **出题人**:阿里巴巴出题专家:江岚/阿里巴巴数据技术高级技术专家
4+
5+
#### **参考答案**
6+
7+
A. 通过 shell 或 python 等调用 api,结果先暂存本地,最后将本地文件上传到 Hive 中。
8+
9+
B. 通过 datax 的 httpReader 和 hdfsWriter 插件,从而获取所需的数据。
10+
11+
C. 比较理想的回答,是在计算引擎的 UDF 中调用查询 api,执行UDF 的查询结果存储到对应的表中。一方面,不需要同步任务的导出导入;另一方面,计算引擎的分布式框架天生提供了分布式、容错、并发等特性。
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#### **题目**:如何实现两金额数据相加(最多小数点两位)?
2+
3+
#### **出题人**:阿里巴巴出题专家:御术/蚂蚁金服数据可视化高级技术专家
4+
5+
#### **参考答案**
6+
7+
其实问题并不难,就是考察候选人对 JavaScript 数据运算上的认知以及考虑问题的缜密程度,有很多坑,可以用在笔试题,如果用在面试,回答过程中还可以随机加入有很多计算机基础的延伸。
8+
9+
回到这个问题,由于直接浮点相与加会失精,所以要转整数;(可以插入问遇到过吗?是否可以举个例子?)。
10+
11+
转整数是第一个坑,虽然只有两位可以通过乘以100转整数,但由于乘以一百和除以一百都会出现浮点数的运算,所以也会失精,还是要通过字符串来转;(可以插入问字符串转整数有几种方式?)字符串转整是第二个坑,因为最后要对齐计算,如果没考虑周全先toFixed(2),对于只有一位小数点数据进入计算就会错误;转整数后的计算是个加分点,很多同学往往就是直接算了,如果可以考虑大数计算的场景,恭喜同学进入隐藏关卡,这就会涉及如何有效循环、遍历、算法复杂度的问题。

0 commit comments

Comments
 (0)