(1)解释Linux中的进程、线程和守护进程的概念,以及如何管理它们?
答:进程:是操作系统进行资源分配的基本单位,拥有独立的地址空间、进程控制块,每个进程之间相互隔离。例如,打开一个终端窗口会启动一个 bash 进程。
线程:是操作系统调度的基本单位,隶属于进程,共享进程的资源,但有独立的线程控制块和栈。线程切换开销远小于进程。例如,一个 Web 服务器的单个进程中,多个线程可同时处理不同客户端的请求。
守护进程:是在后台长期运行的特殊进程,脱离终端控制(避免终端关闭时被终止),通常用于提供系统服务(如定时任务服务 crond、Web 服务 nginx)。其生命周期长,一般随系统启动而启动,随系统关闭而终止。
进程管理:
查看:ps aux(查看所有进程)、top(动态监控进程资源占用);
创建:fork()系统调用(复制父进程创建子进程);
终止:kill [PID](发送信号终止进程)、pkill [进程名](按名称终止);
优先级调整:nice(启动时设置优先级)、renice(运行中调整)。
线程管理:
pthread_create()创建线程、pthread_join()等待线程结束、pthread_exit()终止线程;
查看线程可通过ps -T [PID](显示进程下的线程)或top -H(以线程维度监控)。
守护进程管理:
创建:可通过nohup 命令 &使进程脱离终端(如nohup python server.py &);或编写程序时调用setsid()脱离控制终端、chdir(“/”)切换工作目录等;
管理:通过systemctl(如systemctl start nginx)管理系统守护进程,或直接kill [PID]终止。
(2)请详细描述OSI七层模型和TCP/IP四层模型,并说明它们之间的对应关系。每一层的主要功能是什么?各层有哪些典型的协议?
答:OSI 七层模型(从下到上):
物理层:传输原始比特流(0/1 电信号),定义硬件接口(如电缆、网卡)。典型协议:EIA/TIA-232、RJ45。
数据链路层:将比特流封装为帧,处理物理层错误(如校验),管理 MAC 地址(设备硬件地址)。典型协议:以太网(Ethernet)、PPP、ARP(地址解析,IP 转 MAC)。
网络层:负责数据包的路由和转发,基于 IP 地址跨网络传输,处理拥塞控制。典型协议:IP(网际协议)、ICMP(控制消息,如 ping)、OSPF(路由协议)。
传输层:提供端到端(进程到进程)的通信,控制数据传输的可靠性。典型协议:TCP(可靠传输,三次握手 / 四次挥手、重传机制)、UDP(不可靠传输,速度快)。
会话层:建立、维护和终止进程间的会话(如断点续传的会话恢复)。典型协议:RPC(远程过程调用)、NetBIOS。
表示层:处理数据格式转换(如编码、加密、压缩),使不同系统能理解数据。典型协议:JPEG(图像编码)、SSL/TLS(加密)。
应用层:直接为用户提供服务,定义应用程序间的交互规则。典型协议:HTTP(网页)、FTP(文件传输)、SMTP(邮件)。
TCP/IP 四层模型(从下到上):
网络接口层:对应 OSI 的物理层 + 数据链路层,负责比特流传输和帧处理。
网际层:对应 OSI 的网络层,核心是 IP 协议,负责跨网络路由。
传输层:与 OSI 传输层一致,TCP/UDP 在此层。
应用层:对应 OSI 的会话层 + 表示层 + 应用层,包含所有应用层协议。
(3)详细介绍什么是最大堆/最小堆。
答:最大堆和最小堆是完全二叉树的特殊形式,属于优先队列的实现方式,核心特性是父节点与子节点的数值关系:
最大堆:任意父节点的值 ≥ 其左右子节点的值,根节点是整个堆的最大值。
最小堆:任意父节点的值 ≤ 其左右子节点的值,根节点是整个堆的最小值。
核心操作:
插入:新元素先放在堆的末尾,再通过 “上浮”(与父节点比较,若不符合堆性质则交换,直到根节点)维持堆结构。
删除(取最值):移除根节点(最值),将堆尾元素移到根节点,再通过 “下沉”(与子节点比较,若不符合堆性质则与较大 / 较小子节点交换,直到叶子节点)维持堆结构。
应用场景:堆排序(时间复杂度 O (nlogn))、优先队列(如任务调度中优先执行高优先级任务)、Top-K 问题(快速找到前 K 个最大 / 小元素)。
(4)详细介绍什么是二分搜索树。
答:二分搜索树是一种二叉树,满足以下特性:
对于任意节点,其左子树中所有节点的值 < 该节点的值;
其右子树中所有节点的值 > 该节点的值;
左、右子树也分别是二分搜索树(递归定义)。
核心操作:
查找:从根节点开始,若目标值等于当前节点值则找到;若小于则向左子树查找;若大于则向右子树查找(平均时间复杂度 O (logn),最坏 O (n),如退化为链表)。
插入:类似查找,找到合适的空位置(左子树或右子树)插入新节点。
删除:分三种情况:① 叶子节点:直接删除;② 只有一个子树:子树替代当前节点;③ 有两个子树:用右子树的最小值(或左子树的最大值)替代当前节点,再删除该替代节点。
应用场景:动态查找表、字典(如 Java 的 TreeMap)、范围查询(如查找 [10,50] 之间的元素)。
(1)我们非常欣赏你的能力,但目前只能提供比你期望薪资低20%的offer。在这种情况下,你会接受这份工作吗?如果接受,你对未来薪资增长有什么期望?如果不接受,你的底线是什么?
答:感谢贵公司的认可和 offer。薪资确实是我考虑的因素之一,但我更看重公司的发展平台、团队氛围和成长空间。如果岗位能提供足够的学习机会和上升通道,我可以接受当前的薪资。
关于未来薪资增长,我期望通过 3-6 个月的努力证明自己的价值,希望在试用期结束后能根据业绩重新评估薪资,逐步向期望薪资靠拢。如果长期无法达到合理的薪资水平,我可能会重新考虑职业规划,但我相信通过双方的努力,这一目标是可以实现的。
(2)我们公司经常需要加班到深夜,有时甚至需要周末工作。你如何看待这种工作强度?你认为工作与生活的理想平衡点在哪里?
答:我理解工作中难免有紧急任务需要加班,这种情况下我会积极配合,确保任务按时完成。但我认为长期无意义的加班会影响效率,更倾向于通过合理规划(如提前拆解任务、优化流程)减少无效加班。
对我而言,理想的平衡是:工作时专注高效,确保核心目标达成;生活中能有时间陪伴家人、学习新技能,保持身心状态,从而反哺工作效率。我相信 “可持续的高效” 比 “透支式加班” 更有利于个人和公司的长期发展。
(3)你认为自己最大的优势是什么?这个优势如何帮助你胜任我们这个岗位?
答:我认为自己最大的优势是 “快速学习和解决问题的能力”。例如,在参加上一次项目中,团队突然需要接入一个新的 XX 技术框架,我利用 3 天时间自学核心文档,主导完成了框架迁移,并输出了操作手册帮助团队快速上手,最终提前 2 天完成项目上线。
这个优势对贵公司的岗位很重要:技术领域更新快,岗位可能会涉及某项技术(岗位相关技术)的迭代或新场景落地,我能快速响应需求,减少学习成本;遇到突发问题时,也能快速定位并解决,保障项目推进。
(4)你认为这份工作能为你带来什么?你能为公司创造什么价值?
答:对我而言,这份工作能带来三方面的价值:一是深入实践 XX(岗位核心技能),提升技术深度;二是在贵公司的 XX 业务场景(如行业领先的 XX 模式)中积累经验,拓宽认知;三是与优秀的团队共事,学习高效的协作方式。
我能为公司创造的价值包括:① 用 XX 技能快速落地项目,提升业务效率;② 结合过往经验,提出流程优化建议;③ 保持学习热情,主动承担新任务,助力团队应对更多挑战。④ 处理好与同事之间的关系更好的合作完成公司的项目
(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, 2, 8, 4]
主要功能:
函数遍历列表,对每个元素执行以下操作:
若为最后一个元素,将其乘以 2;
否则,若当前元素小于下一个元素,则加 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, 4]
主要功能:
函数处理列表元素,规则如下:
若元素被 3 整除,将其除以 3;
若为偶数,将其乘以 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]
功能分析:
函数将两个有序数组合并为一个有序数组,使用临时数组存储原数组前 m 个元素,通过双指针比较合并。
(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]))
答:运行结果:7
功能分析:
函数计算交错和(偶数索引累加,奇数索引累减),若过程中结果为负则重置为 0。
(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]
功能分析:
函数将列表分为偶数和奇数两部分,偶数升序排列,奇数降序排列,最后合并。
(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]
功能分析:
函数逐个处理列表元素,奇数直接加入结果,偶数翻倍后移至列表末尾,最终返回所有奇数和处理后的偶数。
(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]))
答:运行结果:[(3, 7), (2, 8)]
功能分析:
函数找出列表中所有和为 10 的不重复数对,每个数仅参与一次匹配。
(8)编写程序,反素数
反素数是指一个将其逆向拼写后也是一个素数的非回文数,例如17和71都是素数但不是回文数,且反转后依旧是素数
输出显示前100个反素数,每行显示10个
答:
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
count = 0
num = 10
while count < 100:
reversed_num = int(str(num)[::-1])
if (
is_prime(num)
and is_prime(reversed_num)
and num != reversed_num
and str(num) != str(num)[::-1]
):
print(f"{num:5d}", end=" " if (count + 1) % 10 != 0 else "\n")
count += 1
num += 1
(9)编写程序,梅森素数
如果一个素数可以写成2p−12^p-12p−1的形式,其中p是某个正整数,那么这个素数就称作梅森素数
输出p≤31的所有梅森素数
答:
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
for p in range(2, 32):
mersenne = 2**p - 1
if is_prime(mersenne):
print(f"p = {p:2d}, 2^{p} - 1 = {mersenne}")
(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
答:
def m(i):
return sum(k / (k + 1) for k in range(1, i + 1))
print("i\tm(i)")
for i in range(1, 21):
print(f"{i}\t{m(i):.3f}")
(11)编写程序,组合问题
有1、2、3、4这个四个数字,能组成多少个互不相同且无重复数字的三位数?分别又是多少?
答:
count = 0
for i in range(1, 5):
for j in range(1, 5):
for k in range(1, 5):
if i != j and i != k and j != k:
print(i * 100 + j * 10 + k, end=" ")
count += 1
print(f"\n共有{count}个三位数")
(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
答:
def factorial(n):
result = 1
for i in range(1, n + 1):
result *= i
return result
i = 10
e = sum(1 / factorial(k) for k in range(0, i + 1))
print(f"e ≈ {e:.10f}")
(13)编写程序,完全数
如果一个正整数等于除了它本身之外所有正因子的和,那么这个数称为完全数
例如 6 = 3 + 2 + 1,28 = 14 + 7 + 4 + 2 + 1
输入输出描述
输入一个正整数
输出该数是否为完全数
示例1
输入:
6
输出:
Yes
示例2
输入:
9
输出:
No
答:
n = int(input())
sum_factors = 0
for i in range(1, n):
if n % i == 0:
sum_factors += i
print("Yes" if sum_factors == n else "No")