笔试整理回忆版

某司笔试复盘与解析


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。
  • 二分查找过程:
    1. 比较中间元素 36,12 < 36,查找左半部分。
    2. 左半部分中间元素是 5,12 > 5,查找右半部分。
    3. 右半部分中间元素是 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 类地址,因为 159128-191 范围内。


6. TCP/IP 协议的状态

题目: 关于 TCP/IP 协议服务器和客户端的状态:

  • 是否经历 SYN_SENDSYN_RECVTIME_WAITESTABLISHED 状态?
  • 服务器收到 SYN 包是否加入半连接队列?

解析:

  1. TCP 三次握手:
    • 客户端发送 SYN,进入 SYN_SEND 状态。
    • 服务器接收 SYN,进入 SYN_RECV 状态。
    • 客户端确认,双方进入 ESTABLISHED 状态。
  2. TIME_WAIT 状态: 连接关闭时,主动关闭方进入 TIME_WAIT 状态。
  3. 半连接队列:
    • 服务器收到 SYN 包后,将连接加入半连接队列,等待客户端确认。

答案:正确


7. 选择排序状态

题目: 数组 (26, 88, 23, 56, 13, 29, 71, 38, 19),选择排序每一步的状态?

解析:

选择排序每次从未排序部分中选出最小元素,放到前面。
初始状态:(26, 88, 23, 56, 13, 29, 71, 38, 19)

  1. 第 1 步:最小值 13,与第 1 个元素交换:(13, 88, 23, 56, 26, 29, 71, 38, 19)
  2. 第 2 步:最小值 19,与第 2 个元素交换:(13, 19, 23, 56, 26, 29, 71, 38, 88)
  3. 第 3 步:最小值 23,保持不变:(13, 19, 23, 56, 26, 29, 71, 38, 88)
  4. 第 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 个资源


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Andrew_Chao

谢谢打赏喵

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值