1.技术面试题
(1)解释Linux中的进程、线程和守护进程的概念,以及如何管理它们?
答:
-
进程:程序的运行实例,有独立资源(内存、文件描述符等),是操作系统资源分配的基本单位。
-
线程:进程内的执行单元,共享进程资源,是 CPU 调度的基本单位,切换开销小,用于提升程序并发效率。
-
守护进程:后台运行、脱离终端控制的特殊进程,随系统启动 / 特定条件启动,执行系统级任务(如日志、服务监听 )。
进程管理
-
查看:
ps -ef
(全量进程信息)、top
/htop
(实时监控资源占用)。 -
控制:
kill <PID>
(终止进程)、kill -9 <PID>
(强制终止)。
线程管理
-
查看:
ps -T -p <PID>
(查进程内线程)、pstack <PID>
(线程栈跟踪)。 -
控制:编程层面通过库(如 Python
threading
、Cpthread
)创建、启停。
守护进程管理(以 systemd
为例)
-
启停:
systemctl start/stop <服务名>
(如httpd
)。 -
状态:
systemctl status <服务名>
(查运行状态、日志)。 -
自启:
systemctl enable/disable <服务名>
(设置开机自启 / 关闭)。
(2)请详细描述OSI七层模型和TCP/IP四层模型,并说明它们之间的对应关系。每一层的主要功能是什么?各层有哪些典型的协议?
答:OSI 七层模型
-
物理层:处理物理介质(网线、无线等)信号传输,定义接口、编码。如 RJ-45、802.11 标准。
-
数据链路层:将比特流组帧,做差错检测、流量控制。如以太网(802.3)、PPP 协议。
-
网络层:路由选路、逻辑寻址(IP),跨网络传数据。如 IP、ICMP、OSPF 协议。
-
传输层:端到端通信,分可靠(TCP)、不可靠(UDP)传输。
-
会话层:建立、管理通信会话,协调交互。功能常被合并,无独立广用协议。
-
表示层:处理数据加密、压缩、格式转换。如 SSL/TLS、JPEG 规范(功能多融合到应用层)。
-
应用层:为应用提供网络接口,定义交互规则。如 HTTP、FTP、SMTP 协议。
TCP/IP四层模型
-
网络接口层:对应 OSI 物理层 + 数据链路层,负责物理传输、帧封装。
-
网络层:同 OSI 网络层,做 IP 寻址、路由转发。核心协议 IP、ICMP 等。
-
传输层:同 OSI 传输层,用 TCP(可靠)、UDP(高效)传数据。
-
应用层:融合 OSI 会话层 + 表示层 + 应用层功能,涵盖 HTTP、DNS 等协议。
对应关系
TCP/IP四层模型 对应 OSI七层模型
网络接口层 物理层+数据链路层
网络层 网络层
传输层 传输层
应用层 会话层+表示层+应用层
(3)详细介绍什么是最大堆/最小堆。
答:最大堆
-
定义:一种完全二叉树结构,其中每个父节点的值 大于或等于 其左右子节点的值。
-
核心特性:根节点是整个堆中的最大值,任意子树也满足最大堆的性质。
-
典型应用:用于高效获取和删除最大值(如优先队列中处理高优先级任务)、堆排序(降序排序时构建最大堆)。
最小堆
-
定义:同样是完全二叉树结构,其中每个父节点的值 小于或等于 其左右子节点的值。
-
核心特性:根节点是整个堆中的最小值,任意子树也满足最小堆的性质。
-
典型应用:用于高效获取和删除最小值(如 Dijkstra 最短路径算法)、实现优先队列(处理低优先级任务优先的场景)、堆排序(升序排序时构建最小堆)。
共同点
-
均为完全二叉树,便于用数组存储(通过索引计算父子节点位置:若父节点索引为
i
,左子节点为2i+1
,右子节点为2i+2
)。 -
插入、删除操作需通过 “上浮” 或 “下沉” 调整结构,维持堆的性质,时间复杂度为 O(log n)(
n
为节点数)。 -
能快速访问极值(根节点),时间复杂度为 O(1)
(4)详细介绍什么是二分搜索树。
答:二分搜索树
-
定义:二叉树的一种,节点值满足:左子树所有节点值 < 当前节点值 < 右子树所有节点值(左、右子树也为 BST)。
-
核心操作
:
-
查找:从根节点开始,按值大小递归查左 / 右子树(O (log n) 平均,O (n) 最坏)。
-
插入:类似查找,找到空位插入,维持值规则。
-
删除:分叶子节点、单子节点、双子节点(用前驱 / 后继替代)三种情况处理。
-
遍历:中序遍历得升序序列。
-
-
特点:高效维护有序数据,不平衡时可能退化为链表(效率下降),是平衡树(如红黑树)的基础。
2.HR面试题
(1)我们非常欣赏你的能力,但目前只能提供比你期望薪资低20%的offer。在这种情况下,你会接受这份工作吗?如果接受,你对未来薪资增长有什么期望?如果不接受,你的底线是什么?
答:
-
试探接受底线:通过压低薪资,判断候选人对岗位的重视程度、薪资弹性空间,以及是否存在 “为机会妥协” 的可能。
-
评估动机优先级:考察候选人更看重 “短期薪资” 还是 “长期发展机会”(如平台资源、成长空间、行业前景等)。
-
预留谈判空间:若候选人有妥协意愿,可进一步明确其对薪资增长的预期,为后续调薪机制提供参考。
正面回答:
若愿意:”感谢贵公司的认可。这个薪资确实低于我的预期,但贵公司在【某某业务上的优势以及岗位能提供的某某实操经验,非常吸引我】。这些是我非常看重的成长资源,我愿意基于对长期价值的认可接受这个 offer。关于未来薪资增长,我希望能通过 3-6 个月的实践证明自己的能力。我相信只要能为团队创造足够的价值,薪资自然会随之体现“
(2)我们公司经常需要加班到深夜,有时甚至需要周末工作。你如何看待这种工作强度?你认为工作与生活的理想平衡点在哪里?
答:HR问这个问题的意图:
-
考察候选人对高强度工作的接受度,是否能适应公司的工作节奏;
-
了解候选人的价值观,是否重视可持续的工作状态,避免招到因无法承受压力而短期离职的人;
-
间接判断候选人的时间管理能力和抗压能力,以及对 “工作意义” 的理解是否与公司文化匹配。
正面回答:
我认为工作中难免有需要集中精力攻坚的阶段,这时加班是团队共同推进目标的体现,我会积极配合。但从长期来看,可持续的效率更重要。对于贵公司的工作强度,我相信如果是基于具体任务的合理安排,我有能力适应;同时我也会努力提升自身效率,在完成工作的前提下兼顾生活节奏,实现两者的动态平衡,为团队持续创造价值
(3)你认为自己最大的优势是什么?这个优势如何帮助你胜任我们这个岗位?
答:HR问这个问题的意图:
-
判断匹配度:通过优势与岗位核心需求的关联度,评估候选人是否具备胜任岗位的关键能力。
-
了解自我认知:考察候选人是否清晰自身优势,以及优势是否真实、具体(避免空泛的 “抗压能力强”“学习能力强” 等表述)。
-
预测贡献价值:推断候选人未来能为团队 / 公司带来的核心价值,是否能解决岗位面临的典型挑战
正面回答:
优势需具体、有案例支撑,且紧密绑定岗位需求,避免脱离岗位空谈优势,体现 “我的优势正是你需要的“。
例如:“我认为自己最大的优势是精准的需求洞察与落地能力。比如在之前的 XX 工作中,曾遇到客户提出的模糊需求,我通过 3 次深度沟通提炼出核心痛点,再转化为可执行的方案,最终不仅满足了客户预期,还额外提出 2 个优化建议,获得了客户的长期合作意向。
我了解到贵岗位需要 [结合岗位描述,如 “对接多部门需求并推动跨团队协作”],而我的优势刚好能帮助快速理解各方诉求、转化为具体行动方案,减少沟通成本,确保协作高效推进。我相信这一能力能让我更快融入团队,为岗位目标的达成提供支持。”
(4)你认为这份工作能为你带来什么?你能为公司创造什么价值?
答:HR问这个问题的意图:
-
判断动机匹配度:通过 “工作能带来什么”,看候选人是否了解公司 / 岗位,动机是否单纯(如仅为薪资,还是重视成长与价值认同),避免因 “需求错位” 导致短期离职。
-
评估价值贡献力:通过 “能为公司创造什么”,考察候选人是否清晰自身优势与岗位的结合点,是否有明确的产出预期,而非 “空有能力却不知如何落地”。
-
观察长期稳定性:若候选人的个人成长需求与公司能提供的平台匹配,且能清晰阐述自身价值,通常更可能长期稳定任职,减少招聘成本。
正面回答:
“对我而言,这份工作首先是一个能让我深耕 [岗位领域] 的平台 —— 贵公司在 [行业优势,如 “零售数字化领域的领先实践”] 非常吸引我,岗位要求的 [具体任务,如 “通过用户分层提升复购率”],既能发挥我过往 [相关经验,如 “3 年用户运营经验”] 的积累,也能让我在 [目标成长点,如 “精细化运营策略”] 上得到突破,这是我最看重的成长价值。
而我能为公司带来的,一方面是 [即时价值,如 “用过往总结的用户分层模型,快速完成初期用户画像搭建”],另一方面,我擅长 [附加能力,如 “通过数据复盘优化策略”],之前曾帮团队 [过往成果,如 “将用户复购率提升 15%”],相信这类经验也能助力贵公司 [业务目标,如 “提升私域用户活跃度”]。我期待在为团队创造实际价值的同时,实现个人与公司的共同成长。”
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, 4, 6, 4]
;函数func
功能是遍历输入列表,依据元素位置和相邻元素大小关系,对每个元素做特定运算(最后一个元素乘 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, 8, 28]
。func主要遍历输入列表,按元素特性做不同运算:能被 3 整除则除以 3;能被 2 整除(且大于 10 时触发break
终止循环 )则乘 2;都不满足则加 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
,类似归并排序的合并逻辑,用于合并有序序列
(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]))
答:运行结果为total=1,func主要遍历列表,按索引奇偶性做累加 / 累减操作(偶数索引加对应元素,奇数索引减对应元素 ),若结果为负则重置为 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]。func的主要功能是将输入列表按元素奇偶性分离到两个子列表,偶数列表升序排序,奇数列表降序排序,最后合并两个子列表并返回。
(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主要遍历列表,每次取出首个元素:若为奇数则加入结果列表;若为偶数则翻倍后放回列表末尾。最终返回 “奇数元素按取出顺序组成的列表” 与 “剩余列表(处理后的偶数及未遍历到的元素)” 的拼接结果,实现对列表元素的奇偶分类及偶数翻倍循环处理逻辑。
(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)]
。func的作用是遍历列表,对每个元素 lst[i]
,从 i+1
位置开始找第一个与它和为 10的元素 lst[j]
,找到后将 (lst[i], lst[j])
加入结果列表,且找到后立即停止当前 i
的内层查找(break
),最终返回所有符合条件的元组。
(8)编写程序,反素数
反素数是指一个将其逆向拼写后也是一个素数的非回文数,例如17和71都是素数但不是回文数,且反转后依旧是素数
输出显示前100个反素数,每行显示10个
答:
def is_prime(num): if num < 2: return False for i in range(2, int(num**0.5) + 1): if num % i == 0: return False return True def reverse_num(num): return int(str(num)[::-1]) count = 0 result = [] num = 10 while count < 100: reversed_num = reverse_num(num) if is_prime(num) and is_prime(reversed_num) and num != reversed_num: result.append(num) count += 1 num += 1 for i in range(0, 100, 10): print(' '.join(map(str, result[i:i+10])))
(9)编写程序,梅森素数
如果一个素数可以写成$2^p-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 result = [] for k in range(1, 32): m = 2**k - 1 if is_prime(m): result.append((k,m))
(10)编写程序,数列求和
编写一个函数计算下面的数列:
$m(i) = \frac{1}{2} + \frac{2}{3} + ... + \frac{i}{i + 1}$
并输出测试结果:
i m(i) 1 0.500 2 1.16 ... 19 16.40 20 17/35
答:
#def c_m(i): result = 0.0 for j in range(1,i + 1): result += j / (j+1) return result for i in range(1,21): m_i = c_m(i) if i == 20: print(f"{i}\t{17/35}" if 17/35==m_i else f"{i}\t{m_i:.3f}") else: print(f"{i}\t{m_i:.2f}")
(11)编写程序,组合问题
有1、2、3、4这个四个数字,能组成多少个互不相同且无重复数字的三位数?分别又是多少?
答:
nums = [1, 2, 3, 4] result = [] for i in nums: for j in nums: for k in nums: if i != j and j != k and i != k: num = i * 100 + j * 10 + k result.append(num) print("能组成", len(result), "互不相同且无重复数字的三位数,分别是:") for num in result: print(num, end=" ")
(12)编写程序,计算e
你可以使用下面的数列近似计算e
$$
e=1+\frac{1}{1!}+\frac{1}{2!}+\frac{1}{3!}+\frac{1}{4!}+...+\frac{1}{i!}
$$
当i越大时,计算结果越近似于e
答:
def c(n): e = 1.0 f = 1 for i in range(1,n+1): f*=i e +=1/f return e n = 10 result = c(n) print(f"e的近似值:{result}")
(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")