1.技术面试题
(1)解释 Linux 中的符号链接和硬链接
在 Linux 系统中,链接(Link)是一种访问文件的方式,主要分为符号链接(又称软链接) 和硬链接 两种。
硬链接是文件系统中多个文件名指向同一个inode(文件的元数据索引节点)的机制。
- 特性:
- 硬链接与原文件共享相同的 inode 和数据块,本质上是同一个文件的不同名称。
- 删除原文件后,硬链接仍然有效(因为 inode 只有在所有链接都被删除后才会释放)。
- 不能跨文件系统创建(因为不同文件系统有独立的 inode 编号空间)。
- 不能链接目录(避免文件系统循环和混乱)。
- 硬链接的权限、所有者等属性与原文件一致(因为共享 inode)。
符号链接是一个独立的特殊文件,其内容是指向另一个文件或目录的路径(类似于 Windows 的快捷方式)。
- 特性:
- 软链接有自己独立的 inode,存储的是目标文件的路径(而非数据)。
- 如果原文件被删除或移动,软链接会失效(变成 “断链”,显示为红色闪烁)。
- 可以跨文件系统创建(因为只记录路径)。
- 可以链接目录(常用作目录快捷方式)。
- 软链接的权限通常显示为
lrwxrwxrwx,但实际访问权限由目标文件决定。
(2)Linux 使用的进程间通信方式有哪些?
管道:分为:匿名管道,命名管道
信号:一种异步通信机制,用于通知进程发生了某种事件。
共享内存:是速度最快的IPC(进程通讯方式)方式.
消息队列:内核维护的一个信息链表,进程可按类型发送/接收消息(类似“信箱”)。
信号量:实现进程间同步与互斥(控制对共享资源的访问)。
套接字:最初为网络通信设计,也可以用于同一个主机上的进程间通信(通过AF_UNIX域协议)。
另外还有:内存映射文件,UNIX域套接字
(3)什么是TCP 三次握手与四次挥手?
TCP(传输控制协议)是一种面向连接、可靠的传输层协议,在数据传输前需要通过 “三次握手” 建立连接,传输结束后通过 “四次挥手” 释放连接。这两个过程是保障 TCP 可靠性的核心机制。
三次握手
第一次握手(客户端 → 服务器):客户端向服务器发送一个 SYN(同步序列编号) 报文,此时客户端状态变为SYN-SENT(等待服务器确认).
第二次握手(服务器→客户端):服务器收到SYN报文后,确认客户端的请求,回复一个SYN-ACK报文,此时服务器状态变为SYN-RECELVED(等待客户确认).
第三次握手(客户端→服务器)
客户端收到SYN-RECEIVED报文后,向服务器发送一个ACK(确认)报文,客户端状态变为 ESTABLISHED(连接建立);服务器收到 ACK 后,也进ESTABLISHED 状态,双方开始传输数据。
四次挥手
第一次挥手(客户端 → 服务器):客户端数据发送完毕,向服务器发送 FIN(结束)报文,客户端状态变为 FIN-WAIT-1(等待服务器确认)
第二次挥手(服务器 → 客户端):服务器收到 FIN 后,回复 ACK 报文。服务器状态变为 CLOSE-WAIT(等待自身数据发送完毕)客户端状态变为 FIN-WAIT-2(等待服务器的 FIN)
第三次挥手(服务器 → 客户端):服务器数据发送完毕,向客户端发送 FIN 报文,服务器状态变为 LAST-ACK(等待客户端确认)
第四次挥手(客户端 → 服务器):客户端收到 FIN 后,回复 ACK 报文,客户端状态变为 TIME-WAIT之后进入 CLOSED;服务器收到 ACK 后,直接进入 CLOSED 状态。
(4)ARP 协议的作用及工作原理
作用
- 正向地址解析:根据已知的 IP 地址,查询对应的 MAC 地址,这是 ARP 最主要的功能。
例如,当主机 A 需要向同一局域网内的主机 B 发送数据时,若 A 已知 B 的 IP 地址但不知道其 MAC 地址,就会通过 ARP 协议获取 B 的 MAC 地址,确保数据帧能准确送达。 - 维护 ARP 缓存表:本地设备会将解析到的 IP 地址与 MAC 地址的映射关系临时存储在 ARP 缓存表中,避免重复解析,提高通信效率。缓存表中的条目有过期时间(通常为 15-300 秒),过期后会被自动删除。
工作原理
1,主机 A 首先查询自己的 ARP 缓存表,看是否存在主机B的IP地址,若存在且未过期,直接使用该 MAC 地址封装数据帧并发送。若不存在或已过期,则进入下一步。
2,主机 A 构造一个 ARP 请求报文,该报文通过广播方式发送到局域网内的所有设备(交换机转发广播帧,所有设备均可接收)。
3,主机 B 收到请求后,发现目标 IP 与自己的 IP 一致,便会将主机 A 的 IP 和 MAC 映射存入自己的 ARP 缓存表(避免后续通信时重复查询),然后构造 ARP 应答报文。
4,主机B发送ARP 应答报文该报文以单播方式直接发送给主机 A(而非广播)。
5,主机 A 收到应答后,将主机 B 的 IP 和 MAC 映射存入自己的 ARP 缓存表,随后即可使用该 MAC 地址封装数据帧,通过交换机转发给主机 B,完成通信。
(5)详细阐述快速排序算法
快速排序的核心是选择一个 “基准值”,然后将数组分为两部分:
- 左部分:所有元素小于基准值
- 右部分:所有元素大于基准值
接着对左右两部分递归执行相同的操作,直到子数组长度为 0 或 1(天然有序),最终整个数组被排序。
(6)详细阐述归并排序算法
归并排序的核心思路可以概括为三个步骤:
- 分解:将原始数组递归地分成两个规模大致相等的子数组,直到每个子数组只包含一个元素(单个元素天然有序)。
- 解决:当子数组无法再分解时,开始逐步合并这些有序的子数组。
- 合并:将两个已排序的子数组合并成一个更大的有序数组,重复此过程直到得到完整的有序数组。
(7)详细阐述基数排序算法
基数排序的核心是按 “位” 排序,即从数据的最低有效位(或最高有效位)开始,依次对每一位进行排序,直到所有位都处理完毕。每一轮排序都基于当前位的值,将元素分配到不同的 “桶” 中,再按桶的顺序重新组合元素。
根据处理位的顺序,基数排序可分为:
- LSD:从最低有效位开始(如个位→十位→百位),适用于整数排序。
- MSD:从最高有效位开始(如百位→十位→个位),适用于字符串排序。
(8)详细阐述桶排序算法
桶排序的核心思路可以分为三个步骤:
- 创建桶:根据数据的范围和分布,创建若干个有序的空桶。
- 分配数据:将待排序的元素按照一定的映射规则分配到对应的桶中。
- 排序与合并:对每个非空桶内的元素进行排序(可使用其他排序算法),然后按桶的顺序依次合并所有桶中的元素,得到最终的有序序列。
2.HR面试题
(1)你为什么选择我们公司?
贵公司在这个*领域的布局和投入,与我的职业目标高度契合,我相信在这里能接触到最前沿的实践,实现个人能力的快速成长。贵公司招聘的 *岗位,的要求,这与我掌握的能力高度匹配。我通过之前的学习也能快速适应该岗位.同时贵公司在某某领域的发展和前景,也对我十分有吸引力,我相信我在这里会有更好的发展.
(2)你现在手里有offer吗?
目前确实收到了其他公司的 offer,主要集中在 [行业领域,如互联网 / 新能源],但经过对贵公司的深入了解 —— 尤其是 [具体吸引点,如核心业务方向、团队氛围、岗位发展空间],我认为这里更符合我的职业规划。相比之下,我更看重贵公司 [具体优势,如在某领域的技术积累、对新人的培养机制],所以目前正优先推进与贵公司的沟通,希望能有机会加入团队。
(3)你认为一份 “好工作” 的核心要素是什么?如果工作内容与预期不符,你会如何调整?
好工作的核心要素:价值匹配,成长空间,基础保障.如果工作内容与预期不符我会先沉下心了解具体差异,如果差距过大,会主动和领导沟通,减少不必要的能力资源浪费.如果差距较小,我会通过对工作内容的判断进行自我调整,和快速适应.以达到工作要求.
(4)如果领导对你的工作成果提出尖锐批评,你会如何回应?
首先会专注听完领导的批评,不打断、不反驳,甚至可以边听边记录关键点,听完后,先针对明确的问题表达认同,不回避责任(即使有客观原因,也先聚焦自身可改进的部分)。在承认问题后,紧接着说明接下来的改进计划,让领导看到你不仅接受批评,更有解决问题的方案。如果暂时没思路,也可以主动请教,体现积极性。回应的最终目的是解决问题,所以后续会按计划落实改进,并在完成后主动反馈
(5)我看你简历里写了学习能力强,你怎么证明你的学习能力强呢?
我的学习能力不是“记住多少知识”,而是知道我所处的情况下知道自己要学什么,怎么学,以及如何运用所学知识解决问题。就像我在大学期间的(遇到了什么问题,我对这个问题的看法,以及为了解绝问题我所做的努力,及方法)这些都可以证明我的学习能力。
(6)如果你的室友在考试中,偷偷让你帮忙传递一个写着知识点的小纸条(现场监管不严,被发现概率低),你会帮吗?请说具体理由,不要只讲大道理。
首先我不会帮助他,因为我觉得考试所检查的是个人实力,就像公司的笔试,如果通过作弊的手段通过的测试,就说明其能力不够,在以后的工作中也会体现出来,从而被淘汰。其次尽管被发现的概率低,我也不会为了帮助他而冒着会使自己陷入不必要的麻烦。而且当他让我帮助他作弊时也就没有考虑我是否会因此而被连累,这样的人也不值得我为他冒险。
(7)你说很想进入我们公司,但你的专业和我们公司关联度不高,而且你也没有相关的实习经历。你觉得我们为什么要相信你是真心想做这个行业,而不是把这里当跳板?
对我来说,留在贵公司能获得 “专业能力 + 行业资源 + 价值认同” 的三重成长,这比 “跳去其他地方” 更有长期价值。而跳板的逻辑是 “此处只是垫脚石”,但我看到的是 “此处就是目的地”。
最后想说:专业和实习经历的不足,我承认是短板,也做好了 “从基础岗位做起、比别人更努力补差距” 的准备。但这份 “非顺理成章” 的选择背后,是经过验证的热情、主动付出的成本,以及对贵公司的深度认同 —— 这些,或许比 “天然匹配” 更能证明我不会轻易离开。
(8)你的成绩在班级里处于中等水平,而我们这个岗位竞争激烈,很多应聘者成绩都很优秀。你觉得自己比他们强在哪里,值得我们录用你?
成绩,更多是 “过去学习状态的证明”,但工作需要的是 “未来能产出什么”。
当然,我也清楚理论基础的重要性,所以最近也在补相关的专业书,但我更相信:比起 “成绩优秀但需要重新适应实践场景”,我这种 “带着实践经验进来,能快速上手解决具体问题” 的人,可能更能快速为团队创造价值。
最后想说:成绩确实是我的短板,我也不会回避。但如果岗位需要的是 “能把事做成的人”,而不是 “能考高分的人”,那我在实践中积累的 “解决问题的逻辑、落地执行的能力、主动调整的灵活性”,或许正是比 “成绩优秀” 更适配的优势。我也愿意用试用期的表现证明:这些积累,能实实在在转化为工作成果。
3.问答题
(1)执行以下代码,输出结果是什么?
def process_list(lst):
for i in range(len(lst)):
if lst[i] % 2 == 0:
lst.insert(i+1, lst[i] // 2)
return lst
nums = [2, 3, 8]
print(process_list(nums))
[2, 1, 3, 8]
(2)运行下列代码,输出结果是什么?
def modify_tuple(t):
try:
t[1] += 10
except:
t = (t[0], t[1]+10, t[2])
return t
tup = (1, 5, 3)
new_tup = modify_tuple(tup)
print(tup[1] + new_tup[1])
20
(3)以下代码的输出结果是什么?
def set_operations():
a = {1, 2, 3}
b = a.copy()
a.add(4)
b.discard(2)
c = a - b
b.update(c)
return len(a & b)
print(set_operations())
4
(4)执行下列代码后,输出结果是什么?
def string_transform(s):
result = []
for i, char in enumerate(s):
if i % 2 == 0:
result.append(char.upper())
else:
result.append(char.lower())
return ''.join(result[::-1])
print(string_transform("PyThOn"))
nOhTyP
(5)运行以下代码,输出结果是什么?
def dict_processing():
d = {'a': 1, 'b': 2, 'c': 3}
new_d = {}
for k, v in d.items():
new_d[v] = k
if v % 2 == 0:
new_d[k.upper()] = v * 2
return sum(new_d.keys())
print(dict_processing())
错误
(6)以下代码的输出结果是什么?
def nested_list_operation():
matrix = [[1, 2], [3, 4], [5, 6]]
total = 0
for i in range(len(matrix)):
matrix[i].append(matrix[i-1][0])
total += sum(matrix[i])
return total
print(nested_list_operation())
30
(7)执行下列代码会产生什么结果?
def tuple_unpacking():
tup = (10, 20, 30, 40)
a, *b, c = tup
b.append(c // a)
return tuple(b)
print(tuple_unpacking()[1] * 2)
60
(8)运行以下代码,输出结果是什么?
def set_generator():
s = set()
for i in range(5):
if i % 2 == 0:
s.add(i)
else:
s.update(range(i))
return sorted(s)[-2]
print(set_generator())
2
(9)以下代码的输出结果是什么?
def string_manipulation():
s = "Hello World Python"
words = s.split()
result = []
for word in reversed(words):
result.append(word[1:-1] if len(word) > 2 else word)
return ' '.join(result)
print(string_manipulation())
ytho orl ell
(10)执行下列代码后,输出结果是什么?
def dict_traversal():
d = {'x': 5, 'y': 10, 'z': 15}
keys = list(d.keys())
for key in keys:
if d[key] > 8:
d[key.upper()] = d.pop(key)
return len(d) + sum(d.values())
print(dict_traversal())
33
2744

被折叠的 条评论
为什么被折叠?



