某司笔试复盘与解析
1. 线程共享的内容
题目: 同一进程下,线程共享以下哪项内容?
选项:Stack(栈)、Data Section(数据段)、Register Set(寄存器集合)、Thread ID(线程ID)
解析:
在同一进程下,线程共享的是以下内容:
- 数据段(Data Section): 包括全局变量和静态变量,所有线程都可以共享访问。
- 堆(Heap): 动态分配的内存也是线程共享的。
- 文件描述符: 线程可以共享打开的文件描述符。
而每个线程有自己的:
- 栈(Stack): 用于存储局部变量、函数调用等,线程独立。
- 寄存器集合(Register Set): 包括程序计数器、栈指针等,每个线程独立。
- 线程ID(Thread ID): 每个线程唯一。
因此,线程共享 数据段,但不共享 栈、寄存器集合 和 线程ID。
2. 查找次数
题目: 在数组 (1, 2, 5, 12, 36, 44, 49, 69, 75, 79, 88, 98, 100)
中,查找 12 需要几次查找?
解析:
这是一个 二分查找 问题。二分查找的时间复杂度是 O(logn)。
- 数组长度为 13。
- 二分查找过程:
- 比较中间元素
36
,12 < 36,查找左半部分。 - 左半部分中间元素是
5
,12 > 5,查找右半部分。 - 右半部分中间元素是
12
,找到目标。
- 比较中间元素
查找次数:3 次。
3. 10TB 文件排序
题目: 对 10TB 的文件进行排序,适合使用什么排序算法?
选项:桶排序、归并排序、希尔排序
解析:
对于超大文件的排序,无法一次性载入内存,通常采用 外部排序。
- 归并排序: 是外部排序的典型算法,将大文件分成多个小文件,分别排序后再合并。
- 桶排序: 适合数据范围较小的情况,不适合 10TB 文件。
- 希尔排序: 是改进的插入排序,适合小规模数据。
因此,归并排序 是最优解。
4. 完全二叉树的叶子节点
题目: 完全二叉树有 289 个节点,问有多少个叶子节点?
解析:
完全二叉树的特性:
- 总节点数为
2n - 1
时,叶子节点数为n
。 - 289 个节点,叶子节点为
(289 + 1) / 2 = 145
。
答案:145 个叶子节点。
5. IP 地址类型
题目: IP 地址 159.226.181.1
是几类地址?为什么?
解析:
根据 IP 地址分类:
- A 类:0.0.0.0 - 127.255.255.255
- B 类:128.0.0.0 - 191.255.255.255
- C 类:192.0.0.0 - 223.255.255.255
159.226.181.1
属于 B 类地址范围。
答案:B 类地址,因为 159
在 128-191
范围内。
6. TCP/IP 协议的状态
题目: 关于 TCP/IP 协议服务器和客户端的状态:
- 是否经历
SYN_SEND
、SYN_RECV
、TIME_WAIT
、ESTABLISHED
状态? - 服务器收到 SYN 包是否加入半连接队列?
解析:
- TCP 三次握手:
- 客户端发送 SYN,进入
SYN_SEND
状态。 - 服务器接收 SYN,进入
SYN_RECV
状态。 - 客户端确认,双方进入
ESTABLISHED
状态。
- 客户端发送 SYN,进入
- TIME_WAIT 状态: 连接关闭时,主动关闭方进入
TIME_WAIT
状态。 - 半连接队列:
- 服务器收到 SYN 包后,将连接加入半连接队列,等待客户端确认。
答案:正确。
7. 选择排序状态
题目: 数组 (26, 88, 23, 56, 13, 29, 71, 38, 19)
,选择排序每一步的状态?
解析:
选择排序每次从未排序部分中选出最小元素,放到前面。
初始状态:(26, 88, 23, 56, 13, 29, 71, 38, 19)
- 第 1 步:最小值
13
,与第 1 个元素交换:(13, 88, 23, 56, 26, 29, 71, 38, 19)
- 第 2 步:最小值
19
,与第 2 个元素交换:(13, 19, 23, 56, 26, 29, 71, 38, 88)
- 第 3 步:最小值
23
,保持不变:(13, 19, 23, 56, 26, 29, 71, 38, 88)
- 第 4 步:最小值
26
,与第 4 个元素交换:(13, 19, 23, 26, 56, 29, 71, 38, 88)
…
完整排序完成后:(13, 19, 23, 26, 29, 38, 56, 71, 88)
。
8. 无右孩子节点数量
题目: 二叉树有 2011 个节点,叶子节点有 116 个,无右孩子的节点有多少个?
解析:
- 对于二叉树,叶子节点数量 + 非叶子节点数量 = 总节点数。
- 非叶子节点数 =
2011 - 116 = 1895
。 - 若假设每个非叶子节点最多有一个右孩子,则无右孩子节点数为
1895 - 116 = 1779
。
9. DFS 时间复杂度与空间复杂度
题目: 图有 n
个节点和 e
条边,DFS 的时间复杂度和空间复杂度?
解析:
- 时间复杂度: 每个节点访问一次,每条边访问一次,
O(n + e)
。 - 空间复杂度: 栈深度为节点数,
O(n)
。
10. 大端模式
题目: 大端模式是指高字节存储在哪?
解析:
大端模式是指高字节存储在低地址,低字节存储在高地址。
11. 后序遍历
题目: 二叉树后续遍历顺序:
A
/ \
B C
/ \ / \
D E F G
解析: 后序遍历顺序为:D -> E -> B -> F -> G -> C -> A
。
你答案为 DEBFGCA
,正确。
12. 死锁问题
题目: 死锁及其避免方法,写一个死锁实例。
解析:
- 死锁: 多个进程互相等待对方持有的资源,导致无法继续执行。
- 避免死锁:
- 破坏死锁的四个必要条件之一(互斥、占有且等待、不可抢占、循环等待)。
- 使用银行家算法。
死锁实例:
pthread_mutex_t lock1, lock2;
void *thread1() {
pthread_mutex_lock(&lock1);
sleep(1);
pthread_mutex_lock(&lock2);
}
void *thread2() {
pthread_mutex_lock(&lock2);
sleep(1);
pthread_mutex_lock(&lock1);
}
13. 资源分配与死锁
题目: 四个并发进程,每个需要 5 个资源,最少多少资源不会死锁?
解析:
根据银行家算法,资源数需满足:
总资源数 >= 进程数 * (最大需求 - 1) + 1
。
因此:4 * (5 - 1) + 1 = 17
。
答案:17 个资源。