1.技术面试题
(1)解释Linux中的进程、线程和守护进程的概念,以及如何管理它们?
答:
进程:是操作系统资源分配的基本单位,拥有独立的内存空间、文件描述符等资源,进程间相互独立。例如,打开一个浏览器就是一个进程。
线程:是进程内的执行单元,共享进程的资源,是调度的基本单位。一个进程可包含多个线程,如浏览器的渲染线程和网络线程。
守护进程:是在后台运行的特殊进程,脱离终端控制,通常在系统启动时运行,用于提供持续服务。
管理方式:
进程管理:通过ps(查看进程)、top(动态监控)、kill(终止进程)、fork()(创建进程)等命令或系统调用。
线程管理:用户态通过pthread库(如pthread_create创建线程、pthread_join等待线程),内核态由调度器管理线程切换。
守护进程管理:通过nohup 命令 &(后台运行)、systemd(systemctl start 服务名)创建或控制,编写守护进程时需通过fork()脱离终端。
(2)请详细描述OSI七层模型和TCP/IP四层模型,并说明它们之间的对应关系。每一层的主要功能是什么?各层有哪些典型的协议?
答:
(1)OSI 七层模型是国际标准化组织(ISO)提出的网络通信体系结构模型,从下到上依次为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
物理层:是 OSI 模型的最底层,主要功能是负责在物理介质上传输原始的比特流,定义了物理连接的机械、电气、功能和规程特性,比如信号的传输方式、接口类型等。典型协议有 RS-232、IEEE 802.3(以太网物理层部分)等。
数据链路层:位于物理层之上,其功能是将物理层传输的原始比特流封装成帧,实现相邻节点之间的可靠数据传输,负责处理数据的差错控制和流量控制,确保数据在链路中正确传输。典型协议包括以太网协议(Ethernet)、PPP(点对点协议)、HDLC(高级数据链路控制协议)等。
网络层:主要功能是实现不同网络之间的数据包路由和转发,解决数据包在不同网络中的传输路径问题。典型协议有 IP(互联网协议)、ICMP(互联网控制消息协议)、ARP(地址解析协议)、RIP(路由信息协议)等。
传输层:负责为源端和目的端的应用程序之间提供可靠的端到端数据传输服务,包括数据的分段与重组、流量控制、差错控制等。典型协议有 TCP(传输控制协议,面向连接、可靠)、UDP(用户数据报协议,无连接、不可靠)等。
会话层:用于建立、管理和终止两个应用程序之间的会话连接,确保通信双方能够有序地进行数据交换,比如对话控制、同步等功能。典型协议有 RPC(远程过程调用协议)、NetBIOS(网络基本输入输出系统)等。
表示层:主要处理数据的表示形式,包括数据的格式转换、加密解密、压缩解压缩等,使不同格式的应用程序之间能够正确理解对方的数据。典型协议有 JPEG、MPEG、ASCII 等(这些更多是数据格式标准,也可视为表示层相关)。
应用层:是 OSI 模型的最高层,直接为用户的应用程序提供网络服务,满足用户的各种网络需求。典型协议有 HTTP(超文本传输协议)、FTP(文件传输协议)、SMTP(简单邮件传输协议)、DNS(域名系统)等。
(2)TCP/IP 四层模型 TCP/IP 四层模型是实际互联网中广泛使用的体系结构,从下到上依次为网络接口层、网络层、传输层和应用层。
网络接口层:对应 OSI 模型的物理层和数据链路层,负责处理与物理网络的接口,将网络层的数据包封装成适合物理传输的帧,并通过物理介质传输。涉及的协议通常与具体的物理网络相关,如以太网协议、PPP 协议等。
网络层:与 OSI 模型的网络层功能基本一致,主要负责数据包的路由和转发,实现不同网络之间的通信。核心协议是 IP 协议,同时还包括 ICMP、ARP 等辅助协议。
传输层:和 OSI 模型的传输层功能相同,为应用程序提供端到端的可靠或不可靠数据传输服务,主要协议是 TCP 和 UDP。
应用层:融合了 OSI 模型的会话层、表示层和应用层的功能,直接为用户应用程序提供各种网络服务,包含 HTTP、FTP、SMTP、DNS 等协议。
(3)两者的对应关系:
OSI 的物理层和数据链路层对应 TCP/IP 的网络接口层。
OSI 的网络层对应 TCP/IP 的网络层。
OSI 的传输层对应 TCP/IP 的传输层。
OSI 的会话层、表示层和应用层对应 TCP/IP 的应用层。
(3)详细介绍什么是最大堆/最小堆。
答:
最大堆:每个父节点的值 大于等于 子节点的值(根节点为最大值)。最大堆是一种完全二叉树结构,其中每个父节点的值都大于或等于其左右子节点的值,且堆顶元素(根节点)是整个堆中的最大值。
最小堆:每个父节点的值 小于等于 子节点的值(根节点为最小值)。最小堆则是每个父节点的值都小于或等于其左右子节点的值,堆顶元素是整个堆中的最小值。
(4)详细介绍什么是二分搜索树。
答:
二分搜索树是一种节点值唯一、左子树所有节点值均小于根节点值、右子树所有节点值均大于根节点值,且左右子树也递归满足该性质的二叉树,它通过中序遍历可得到升序序列,在最坏情况下退化为链表时间复杂度降为线性,而期望情况下查找、插入和删除均能在对数时间内完成,因此常配套自平衡策略如AVL或红黑树使用。
2.HR面试题
(1)我们非常欣赏你的能力,但目前只能提供比你期望薪资低20%的offer。在这种情况下,你会接受这份工作吗?如果接受,你对未来薪资增长有什么期望?如果不接受,你的底线是什么?
答:
感谢公司的认可!我非常看重贵公司的发展平台和团队氛围,若岗位能提供足够的成长空间,我可以接受当前薪资。但希望未来能有明确的薪资增长机制,并根据我的贡献逐步调整至合理水平。
(2)我们公司经常需要加班到深夜,有时甚至需要周末工作。你如何看待这种工作强度?你认为工作与生活的理想平衡点在哪里?
答:
我理解项目紧急时需要加班,但更倾向于通过高效规划减少无效加班。我认为理想的工作生活平衡在于高效完成核心任务的同时保障个人恢复时间,既能为公司创造可持续价值,又能保持身心健康的最佳状态。
(3)你认为自己最大的优势是什么?这个优势如何帮助你胜任我们这个岗位?
答:
我最大的优势是快速学习与实践落地能力。就像在课程设计中接触到陌生的JavaScript,我用3天啃完基础教程并动手实操,不仅按时完成小组任务,还优化了数据可视化呈现方式;也曾在校园创业大赛中,因队友临时退出独自接手PPT制作,半天内恶补设计技巧完成方案,最终助团队拿到二等奖,这能帮我快速应对岗位中的新挑战。
(4)你认为这份工作能为你带来什么?你能为公司创造什么价值?
答:
对我而言,这份工作能提供将专业知识转化为实战能力的平台,让我在真实业务场景中学习行业逻辑、积累岗位经验,比如通过参与实际项目理解业务流程、掌握协作方法,快速从学生思维转向职场思维;同时,公司的资源和团队经验也能帮我弥补短板,实现从“会做”到“精通”的成长。
而我能为公司创造的价值,一方面是作为新人的活力与执行力——比如用快速学习能力快速上手工作,像过去在校园项目中那样高效推进任务,减少磨合成本;另一方面是从学生视角带来的差异化思考,比如在用户需求挖掘或活动策划中,结合对同龄人的理解提出贴近目标群体的想法,助力业务落地。
3.问答题
(1)以下代码运行结果是?并阐述函数func的主要功能是什么?
def func(lst):
result = []
for i in range(len(lst)):
if i == len(lst) - 1:
result.append(lst[i] * 2)
elif lst[i] < lst[i+1]:
result.append(lst[i] + 1)
else:
result.append(lst[i] - 1)
return result
print(func([5, 3, 7, 2]))
答:
[4, 8, 1, 4]
函数 func 的功能:
遍历列表中的每个元素。若当前元素是最后一个元素,则将其翻倍;否则若它比下一个元素小,则加 1,否则减 1,最终返回按上述规则处理后的新列表。
(2)以下代码运行结果是?并阐述函数func的主要功能是什么?
def func(lst):
result = []
for num in lst:
if num % 3 == 0:
result.append(num // 3)
elif num % 2 == 0:
result.append(num * 2)
if num > 10:
break
else:
result.append(num + 1)
return result
print(func([9, 4, 12, 7, 14]))
答:
[3, 8, 24]
函数 func的功能:
按顺序遍历列表中的每个数字;若数字能被 3 整除,则把其除以 3 的结果加入结果列表;若数字能被 2 整除,则把其乘以 2 的结果加入结果列表,且一旦该数字大于 10,立即终止整个遍历;否则,把原数字加 1 后加入结果列表。
(3)以下代码运行结果是?并阐述函数func的主要功能是什么?
def func(nums1, m, nums2, n):
i = j = k = 0
temp = nums1.copy()
while i < m and j < n:
if temp[i] < nums2[j]:
nums1[k] = temp[i]
i += 1
else:
nums1[k] = nums2[j]
j += 1
k += 1
while i < m:
nums1[k] = temp[i]
i += 1
k += 1
return nums1
nums1 = [1, 3, 5, 0, 0]
m = 3
nums2 = [2, 4]
n = 2
print(func(nums1, m, nums2, n))
答:
[1, 2, 3, 4, 5]
函数 func的功能:
将已按升序排好序的 nums1前 m 个元素与同样升序的 nums2前n个元素合并,并把合并后的升序结果直接写回 nums1,返回合并后的nums1。
(4)以下代码运行结果是?并阐述函数func的主要功能是什么?
def func(lst):
total = 0
for i in range(len(lst)):
if i % 2 == 0:
total += lst[i]
else:
total -= lst[i]
if total < 0:
total = 0
return total
print(func([5, 3, 2, 7, 1]))
答:
5
函数 func的功能:
从左到右遍历列表,偶数索引(0, 2, 4…)的元素累加到 total,奇数索引(1, 3, 5…)的元素从 total 中扣除;每当 total小于 0 时立即将其重置为 0,最终返回经过上述规则处理后的非负 total 值。
(5)以下代码运行结果是?并阐述函数func的主要功能是什么?
def func(lst):
evens = []
odds = []
for num in lst:
if num % 2 == 0:
evens.append(num)
else:
odds.append(num)
evens.sort()
odds.sort(reverse=True)
return evens + odds
print(func([3, 1, 4, 1, 5, 9, 2, 6, 5]))
答:
[2, 4, 6, 9, 5, 5, 3, 1, 1]
函数 func的功能:
对于每个数字 num,如果是偶数,则添加到 evens;否则添加到 odds。evens 按升序排序,odds 按降序排序。再将排序后的 evens 和 odds 拼接后返回
(6)以下代码运行结果是?并阐述函数func的主要功能是什么?
def func(lst):
result = []
for i in range(len(lst)):
current = lst.pop(0)
if current % 2 == 0:
lst.append(current * 2)
else:
result.append(current)
return result + lst
data = [1, 2, 3, 4, 5]
print(func(data))
答:
[1, 3, 5, 4, 8]
函数 func的功能:
依次从列表头部弹出元素,若该元素为奇数则直接加入 result,若该元素为偶数则将其乘以 2 后重新追加到列表尾部;当所有元素都被处理过一遍后,把 result 与剩余仍在列表中的元素拼接并返回。
(7)以下代码运行结果是?并阐述函数func的主要功能是什么?
def func(lst):
result = []
for i in range(len(lst)):
for j in range(i+1, len(lst)):
if lst[i] + lst[j] == 10:
result.append((lst[i], lst[j]))
break
return result
print(func([5, 3, 7, 2, 8]))
答:
[(5, 5), (3, 7), (7, 3)]
函数 func的功能:
在列表中找到所有首次出现且和为 10 的不同顺序的数对(i, j 且 i < j),并按从左到右的顺序收集这些二元组,遇到一对后立即停止继续寻找以当前元素开头的其它配对。
(8)编写程序,反素数
反素数是指一个将其逆向拼写后也是一个素数的非回文数,例如17和71都是素数但不是回文数,且反转后依旧是素数
输出显示前100个反素数,每行显示10个
答:
#
def sushu(n):
if n < 2:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
def reverse_number(n):
reversed_num = 0
temp = n
while temp > 0:
last = temp % 10
reversed_num = reversed_num * 10 + last
temp = temp // 10
return reversed_num
count = 0
num = 10
arr = []
print("前100个反素数:")
while count < 100:
reversed_num = reverse_number(num)
if num != reversed_num:
if sushu(num):
if sushu(reversed_num):
arr.append(num)
count += 1
num += 1
for i in range(100):
print(f"{arr [i]:6}", end="")
if (i + 1) % 10 == 0:
print()
(9)编写程序,梅森素数
如果一个素数可以写成2p−12^p-12p−1的形式,其中p是某个正整数,那么这个素数就称作梅森素数
输出p≤31的所有梅森素数
答:
# Your Codes
(10)编写程序,数列求和
编写一个函数计算下面的数列:
m(i)=12+23+...+ii+1m(i) = \frac{1}{2} + \frac{2}{3} + ... + \frac{i}{i + 1}m(i)=21+32+...+i+1i
并输出测试结果:
i m(i)
1 0.500
2 1.16
...
19 16.40
20 17/35
答:
#
arr = []
s = 0
for k in range(1, 21):
s += k / (k + 1)
arr.append(s)
print("i ", end="")
print("m(i)")
for i in range(20):
print(str(i + 1), end=" ")
print(f"{arr[i]:.2f}")
(11)编写程序,组合问题
有1、2、3、4这个四个数字,能组成多少个互不相同且无重复数字的三位数?分别又是多少?
答:
#
arr = [1, 2, 3, 4]
count = 0
numbers = []
for a in arr:
for b in arr:
for c in arr:
if a != b and b != c and a != c: # 互不相同
count += 1
numbers.append(100 * a + 10 * b + c)
print("共", count, "个")
print("分别是:", numbers)
(12)编写程序,计算e
你可以使用下面的数列近似计算e
e=1+11!+12!+13!+14!+...+1i!
e=1+\frac{1}{1!}+\frac{1}{2!}+\frac{1}{3!}+\frac{1}{4!}+...+\frac{1}{i!}
e=1+1!1+2!1+3!1+4!1+...+i!1
当i越大时,计算结果越近似于e
答:
#
i = int(input("请输入 i 的值:"))
e = 1
n = 1
for k in range(1, i + 1):
n *= k
e += 1 / n
print("e =", e)
(13)编写程序,完全数
如果一个正整数等于除了它本身之外所有正因子的和,那么这个数称为完全数
例如 6 = 3 + 2 + 1,28 = 14 + 7 + 4 + 2 + 1
输入输出描述
输入一个正整数
输出该数是否为完全数
示例1
输入:
6
输出:
Yes
示例2
输入:
9
输出:
No
答:
#
n = int(input())
s = 0
for i in range(1, n):
if n % i == 0:
s += i
if s == n:
print("Yes")
else:
print("No")
1673

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



