python第三次作业
1.技术面试题
(1)解释Linux中的进程、线程和守护进程的概念,以及如何管理它们?
答:进程:进程是程序的一次执行实例,是 Linux 系统进行资源分配和调度的基本单位。
管理:ps查看进程,kill结束进程,top看资源占用
线程:线程是进程内的一个执行单元,是 CPU 调度的基本单位。同一进程内的线程共享进程的资源,但拥有独立的栈空间、寄存器和程序计数器。
管理:依赖 POSIX 线程库,pthread_create()创建线程、pthread_join()等待线程结束、pthread_mutex实现线程同步。ps 查看进程、top 监控。
守护进程:是在后台默默运行的特殊进程,没有交互界面。一般独立于控制终端,通常在系统启动时启动。
管理:用systemctl start/stop控制
(2)请详细描述OSI七层模型和TCP/IP四层模型,并说明它们之间的对应关系。每一层的主要功能是什么?各层有哪些典型的协议?
答:OSI七层
TCP/IP四层
对应关系
网络接口层 → 物理层 + 数据链路层
网络层 → 网络层
传输层 → 传输层
应用层 → 会话层 + 表示层 + 应用层
(3)详细介绍什么是最大堆/最小堆。
答:
1.基本定义
堆是一种特殊的完全二叉树数据结构
最大堆(Max Heap):每个节点的值都大于或等于其子节点的值(根节点最大)
最小堆(Min Heap):每个节点的值都小于或等于其子节点的值(根节点最小)
2.存储结构
堆通常用数组实现(下标从 0 开始)
若父节点索引为i,则左子节点索引为2i+1,右子节点索引为2i+2。
若子节点索引为i,则父节点索引为(i-1)//2。
(4)详细介绍什么是二分搜索树。
答:1、性质
二分搜索树 是一种基于二叉树的数据结构
有序性:对于任意节点:
左子树的所有节点值 ≤ 当前节点值
右子树的所有节点值 ≥ 当前节点值
递归结构:左子树和右子树也必须是二分搜索树
2、 特点
中序遍历(左→根→右)的结果是升序序列
查找、插入、删除操作的平均时间复杂度为 O (logn)(平衡时),最坏情况(如退化为链表)为 O (n)
3、核心操作
查找:从根节点开始,若目标值等于当前节点值则找到;若小于当前节点值,递归查找左子树;若大于则递归查找右子树。
插入:从根节点开始,若目标值小于当前节点值且左子树为空,插入左子树;若大于且右子树为空,插入右子树;否则递归深入对应子树。
删除:
叶子节点(无左右子树),直接删除;
只有左子树或右子树,用子树的根节点替换当前节点;
有左右子树,找到当前节点的前驱(左子树最大值)或后继(右子树最小值),用其值替换当前节点,再删除前驱 / 后继(转化为前两种情况)。
2.HR面试题
(1)我们非常欣赏你的能力,但目前只能提供比你期望薪资低20%的offer。在这种情况下,你会接受这份工作吗?如果接受,你对未来薪资增长有什么期望?如果不接受,你的底线是什么?
答:首先感谢公司的认可,作为应届生,初入社会的我更看重学习机会和成长空间。这个岗位符合我的职业规划,我愿意暂时接受稍低的薪资,但希望能在6个月后根据我的能力表现重新评估,得到一份更合适的报酬。
我的底线是能满足当地基本生活需求消费,并往上多余20%左右以应对生活可能的意外。同时,我希望了解公司的晋升机制和调薪频率,能帮助我更好的适应在这里生活。
(2)我们公司经常需要加班到深夜,有时甚至需要周末工作。你如何看待这种工作强度?你认为工作与生活的理想平衡点在哪里?
答:我能理解项目紧急时需要加班。作为新人,我愿意投入时间学习和适应。但我认为长期高强度加班会影响工作效率和对工作的积极性。我理想的工作节奏是:平时适当加班,周末尽量保证休息时间。我会通过提高白天工作效率来减少不必要的加班,及时配合团队完成重要项目,与团队共进退。
(3)你认为自己最大的优势是什么?这个优势如何帮助你胜任我们这个岗位?
答:我认为自己最大的优势是\"系统性问题分析与工程化解决能力\"。我习惯用计算机科学的系统思维拆解问题。例如在开发分布式系统时,能够快速识别性能瓶颈(如数据库IO或网络延迟),并通过分治策略设计优化方案。我不局限于系统理论,可以结合实际资源找到能够解决问题的方案,尽力完成任务的要求。
面对复杂需求时,可以用UML梳理模块关系,评估技术选型,遇到bug能快速定位问题根源,在资源受限时,能够给出渐进式优化方案(如先加缓存再重构)。
(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 resultprint(func([5, 3, 7, 2]))
答:[4, 4, 8, 4]
主要功能:该函数接受一个列表作为参数,遍历输入列表。对于列表中的元素除最后一个外,若当前元素小于其下一个元素,则在结果列表中添加当前元素加 1 后的结果;若当前元素大于等于其下一个元素,则添加当前元素减 1 后的结果。对于列表的最后一个元素,将其值乘以 2 后添加到结果列表中,最后返回处理后的结果列表。
(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 resultprint(func([9, 4, 12, 7, 14]))
答:[3, 8]
该函数接受一个列表作为参数,遍历列表中的每个数字。如果数字能被 3 整除,就将该数字除以 3 的结果添加到结果列表中;如果数字能被 2 整除,就将该数字乘以 2 的结果添加到结果列表中;并且如果此时该数字大于 10 ,则直接终止循环;如果数字既不能被 3 整除也不能被 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 nums1nums1 = [1, 3, 5, 0, 0]m = 3nums2 = [2, 4]n = 2print(func(nums1, m, nums2, n))
答:[1, 2, 3, 4, 5]
该函数将两个有序数组合并成一个有序数组。它接收两个有序数组nums1和nums2,以及它们各自已有的有效元素个数m和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 totalprint(func([5, 3, 2, 7, 1]))
答:3
函数用于对给定列表进行特定规则的数值计算。遍历列表对索引为偶数的元素进行累加,对索引为奇数的元素进行累减 ,在计算过程中如果结果小于 0,则将结果重置为 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 + oddsprint(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 + lstdata = [1, 2, 3, 4, 5]print(func(data))
答:[1, 3, 5, 4, 8]
该函数遍历输入列表,对列表中的元素进行奇偶性判断。如果元素是奇数,则将其添加到结果列表中;如果元素是偶数,则将该偶数乘以 2 后添加回原列表末尾。最后将处理过程中收集的奇数组成的结果列表与处理后的原列表合并并返回。
(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 resultprint(func([5, 3, 7, 2, 8]))
答:[(3, 7)]
该函数给定列表中寻找两个元素,使它们的和等于 10 。通过两层嵌套循环遍历列表,外层循环遍历列表中的每个元素,内层循环从外层循环当前元素的下一个位置开始遍历,检查两个元素之和是否为 10 。若找到这样的元素对,就将其以元组形式添加到结果列表中,并终止内层循环。最后返回找到的满足条件的元素对组成的列表。
(8)编写程序,反素数
反素数是指一个将其逆向拼写后也是一个素数的非回文数,例如17和71都是素数但不是回文数,且反转后依旧是素数
输出显示前100个反素数,每行显示10个
答:
def is_p(a): if a < 2: return False for i in range(2, int(a ** 0.5) + 1): if a % i == 0: return False return Truedef is_pal(a): return str(a) == str(a)[::-1]c = 0n = 10r = []while c < 100: if not is_pal(n) and is_p(n): rn = int(str(n)[::-1]) if is_p(rn) and rn != n: r.append(n) c += 1 n += 1for i in range(0, 100, 10): print(\' \'.join(map(str, r[i:i + 10])))
(9)编写程序,梅森素数
如果一个素数可以写成2p−12^p-12p−1的形式,其中p是某个正整数,那么这个素数就称作梅森素数
输出p≤31的所有梅森素数
答:
def is_p(n): if n < 2: return False for i in range(2, int(n ** 0.5) + 1): if n % i == 0: return False return Truefor p in range(1, 32): m = 2 ** p - 1 if is_p(m): print(m)
(10)编写程序,数列求和
编写一个函数计算下面的数列:
m(i)=12+23+...+ii+1m(i) = \\frac{1}{2} + \\frac{2}{3} + ... + \\frac{i}{i + 1}m(i)=21+32+...+i+1i
并输出测试结果:
im(i)10.50021.16...1916.402017/35
答:
def sl(i): \"\"\" 计算数列 m(i) = 1/2 + 2/3 + ... + i/(i+1) \"\"\" total = 0.0 for n in range(1, i + 1): total += n / (n + 1) return round(total, 3)print(\"i\\tm(i)\")print(\"-\" * 15)for i in range(1, 21): result =sl(i) print(f\"{i}\\t{result:.3f}\")
(11)编写程序,组合问题
有1、2、3、4这个四个数字,能组成多少个互不相同且无重复数字的三位数?分别又是多少?
答:
count = 0for 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: num = i * 100 + j * 10 + k print(num) count += 1print(\"能组成互不相同且无重复数字的三位数个数为:\", 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 js(n): e = 0 f = 1 for i in range(n): if i > 0: f *= i # 更新阶乘值 e += 1 / f # 累加每一项 return en = int(input(\"请输入要计算的项数:\"))result = js(n)print(f\"e的值(前{n}项): {result}\")
(13)编写程序,完全数
如果一个正整数等于除了它本身之外所有正因子的和,那么这个数称为完全数
例如 6 = 3 + 2 + 1,28 = 14 + 7 + 4 + 2 + 1
输入输出描述
输入一个正整数
输出该数是否为完全数
示例1
输入:
6
输出:
Yes
示例2
输入:
9
输出:
No
答:
def wqs(n): \"\"\" 判断一个数是否为完全数 \"\"\" if n <= 1: return False sum = 1 for i in range(2, int(n**0.5) + 1): if n % i == 0: sum += i if i != n // i: # 避免重复添加平方数 sum += n // i return sum == nnum = int(input(\"请输入一个正整数: \"))print(\"Yes\" if wqs(num) else \"No\")