python第五次作业

1.技术面试题

(1)解释 Linux 中的符号链接和硬链接
符号链接:
符号链接是一种特殊类型的文件,它指向另一个文件或目录的路径。可以将其视为快捷方式,存储的是目标文件的路径而非实际数据。删除符号链接不会影响目标文件,但如果目标文件被删除或移动,符号链接将失效。
硬链接:
硬链接是文件系统中同一文件的另一个名称,与原始文件共享相同的 inode(索引节点)和数据块。删除硬链接或原始文件不会影响其他链接,只有当所有硬链接被删除后,文件数据才会被释放。

(2)Linux 使用的进程间通信方式有哪些?
管道:
管道是一种半双工的通信方式,数据只能单向流动。通常用于具有亲缘关系的进程间通信,比如父子进程。管道分为匿名管道和命名管道(FIFO)。匿名管道通过 pipe() 系统调用创建,而命名管道通过 mkfifo() 创建。
消息队列:
消息队列是保存在内核中的消息链表,允许多个进程通过读写队列中的消息进行通信。与管道不同,消息队列独立于读写进程存在,进程终止后消息队列不会被自动删除。Linux 提供了 msgget()、msgsnd() 和 msgrcv() 等系统调用操作消息队列。
共享内存:
共享内存允许多个进程访问同一块内存区域,是最高效的进程间通信方式之一。通过 shmget() 创建共享内存段,shmat() 将其附加到进程地址空间。共享内存需要配合信号量或锁机制来同步读写操作。
信号量:
信号量用于进程间的同步,通常与共享内存结合使用以避免竞争条件。Linux 提供了 semget()、semop() 等系统调用操作信号量。信号量可以是二值信号量(类似锁)或计数信号量(限制资源访问数量)。
信号:
信号是异步通信机制,用于通知进程发生了某个事件。进程可以通过 signal() 或 sigaction() 注册信号处理函数。常见的信号包括 SIGINT(中断)、SIGKILL(强制终止)等。
套接字:
套接字支持不同主机间的进程通信,也可用于同一主机的进程间通信。TCP 和 UDP 是常见的套接字类型。通过 socket()、bind()、listen() 和 accept() 等系统调用实现通信。
文件锁:
文件锁通过 flock() 或 fcntl() 系统调用实现,用于协调多个进程对同一文件的并发访问。支持共享锁(读锁)和独占锁(写锁),避免读写冲突。
内存映射:
内存映射通过 mmap() 将文件映射到进程地址空间,多个进程可以共享同一文件的映射区域。适用于需要频繁读写文件的场景,效率高于普通文件 I/O。

(3)什么是TCP 三次握手与四次挥手?
TCP 三次握手:
TCP 三次握手是建立连接的过程,确保通信双方都有发送和接收数据的能力。

1.客户端发送SYN包
客户端向服务器发送一个SYN(同步序列编号)包,表示请求建立连接。SYN=1,seq=x(x为随机生成的初始序列号)。

2.服务器回应SYN+ACK包
服务器收到SYN包后,发送SYN+ACK包作为响应。SYN=1,ACK=1,ack=x+1(确认客户端的序列号),seq=y(服务器随机生成的初始序列号)。

3.客户端发送ACK包
客户端确认服务器的SYN包,发送ACK包。ACK=1,ack=y+1(确认服务器的序列号)。此时连接建立成功,双方可以开始数据传输。

TCP 四次挥手:
TCP 四次挥手是断开连接的过程,确保双方数据完全传输完毕并安全关闭连接。

1.客户端发送FIN包
客户端发送FIN(结束)包,表示数据发送完毕,请求关闭连接。FIN=1,seq=u(u为当前序列号)。

2.服务器回应ACK包
服务器收到FIN包后,发送ACK包确认。ACK=1,ack=u+1,seq=v(v为服务器当前序列号)。此时客户端到服务器的连接关闭,但服务器仍可发送数据。

3.服务器发送FIN包
服务器完成数据发送后,发送FIN包请求关闭连接。FIN=1,ACK=1,seq=w(w为新的序列号),ack=u+1。

4.客户端回应ACK包
客户端收到FIN包后,发送ACK包确认。ACK=1,ack=w+1,seq=u+1。此时连接完全关闭。
(4)ARP 协议的作用及工作原理
ARP 协议的作用:
ARP(地址解析协议)的主要作用是将网络层的 IP 地址解析为数据链路层的 MAC 地址。在局域网通信中,设备需要通过 MAC 地址进行数据帧的传输,而 ARP 协议通过查询或广播的方式建立 IP 地址与 MAC 地址的映射关系,确保数据能够正确送达目标设备。

ARP 的工作原理:
1.ARP 请求
当主机 A 需要与主机 B 通信时,主机 A 会检查自己的 ARP 缓存表,查找主机 B 的 IP 地址对应的 MAC 地址。如果缓存中没有该记录,主机 A 会发送一个 ARP 请求广播帧,询问“谁拥有 IP 地址 X.X.X.X?请告诉你的 MAC 地址”。

2.ARP 响应
主机 B 收到 ARP 请求后,发现请求的 IP 地址与自己的 IP 地址匹配,会向主机 A 发送一个 ARP 响应单播帧,包含自己的 MAC 地址。其他主机则会忽略该 ARP 请求。

3.ARP 缓存更新
主机 A 收到 ARP 响应后,会将主机 B 的 IP 地址和 MAC 地址映射关系存入 ARP 缓存表,后续通信将直接使用缓存的 MAC 地址。

4.ARP 缓存老化
ARP 缓存表具有时效性,通常缓存条目会在一定时间(如 20 分钟)后自动删除,以确保网络设备变更时能及时更新映射关系。

(5)详细阐述快速排序算法
快速排序的核心是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,再递归地对两部分进行排序。
算法步骤:
1.选择基准:
从数组中选择一个元素作为基准。通常可选择第一个元素、最后一个元素、中间元素或随机元素。

2.分区:
将数组分为两部分,使得左边部分的元素均小于等于基准,右边部分的元素均大于基准。分区过程是快速排序的关键,常用双指针法实现。

3.递归排序:
对分区后的左右子数组递归调用快速排序,直到子数组长度为1或0(自然有序)。

时间复杂度分析:
最优/平均情况:每次分区将数组均匀分成两部分,递归树高度为 log⁡n\log nlogn,每层处理时间为 O(n)O(n)O(n),总时间为 O(nlog⁡n)O(n \log n)O(nlogn)
最坏情况:数组已有序或逆序,分区极度不平衡,递归树退化为链表,时间为 O(n2)O(n^2)O(n2)

稳定性与空间复杂度:
不稳定排序:分区过程中相同元素的相对位置可能改变。
空间复杂度:递归调用栈的深度为 O(log⁡n)O(\log n)O(logn)(最优)或 O(n)O(n)O(n)(最坏)。可通过尾递归优化减少栈空间。

(6)详细阐述归并排序算法
归并排序算法的核心思想是将待排序数组递归分解为更小的子数组,直到子数组长度为1,再通过合并操作将有序子数组合并为更大的有序数组。该算法的时间复杂度为O(n log n),空间复杂度为O(n)。
算法步骤:
1.分解阶段:
将当前数组从中间位置分为左右两个子数组,递归地对左右子数组进行分解,直到子数组长度为1(自然有序)。

2.合并阶段:
创建一个临时数组存放合并结果。比较左右子数组的首元素,将较小者放入临时数组,并移动对应子数组的指针。重复此过程直到某一子数组被完全合并,再将剩余子数组的元素直接追加到临时数组末尾。

(7)详细阐述基数排序算法
基数排序算法的核心思想是将整数按位数切割成不同的数字,然后按每个位数分别比较排序。基数排序适用于整数或字符串等可分解为离散部分的数据类型。
算法工作原理:
基数排序分为两种模式:最低位优先(LSD)和最高位优先(MSD)。LSD从最低位开始排序,MSD从最高位开始排序。以下以LSD为例说明:

按位分配:从最低位开始,根据当前位的值(0-9)将元素分配到对应的桶(Bucket)中。
按序收集:按桶的顺序(0到9)依次收集元素,形成新的序列。
重复操作:对更高一位重复上述步骤,直至最高位处理完成。
时间复杂度与空间复杂度:
时间复杂度:
最优/平均/最坏:O(d⋅(n+k))O(d \cdot (n + k))O(d(n+k)),其中 ddd 为最大位数,nnn 为元素数量,kkk 为基数(如十进制中 k=10k=10k=10)。
空间复杂度:O(n+k)O(n + k)O(n+k),需额外空间存储桶。
(8)详细阐述桶排序算法
桶排序是一种分布式排序算法,适用于数据分布均匀且范围已知的情况。其核心思想是将数据分到有限数量的桶中,每个桶再分别排序(通常使用其他排序算法),最后合并所有桶的结果。
算法步骤:
1.初始化桶
根据数据范围和分布特性,确定桶的数量和每个桶的区间范围。例如,数据范围为 [0, 100),可以创建 10 个桶,每个桶负责 [10i, 10(i+1)) 的子区间。

2.数据分配到桶
遍历待排序数组,根据元素值将其分配到对应的桶中。分配规则通常为:
[ \text{桶索引} = \left\lfloor \frac{\text{元素值}}{\text{桶大小}} \right\rfloor ]

3.桶内排序
对每个非空桶内的数据使用其他排序算法(如插入排序、快速排序等)进行排序。如果数据分布均匀,桶内数据量较少,插入排序效率较高。

4.合并结果
按桶的顺序依次将各桶内的有序数据合并,得到最终排序结果。
时间复杂度分析:
最佳情况:数据均匀分布,每个桶内元素数量接近,时间复杂度为 (O(n + k)),其中 (k) 为桶的数量。
最坏情况:数据全部集中在少数桶内,退化为 (O(n^2))(如桶内使用插入排序)。
平均情况:假设数据均匀分布,时间复杂度为 (O(n + \frac{n^2}{k} + k)),当 (k \approx n) 时为 (O(n))。

空间复杂度:
需要额外空间存储桶,空间复杂度为 (O(n + k)),其中 (n) 为数据量,(k) 为桶的数量。

2.HR面试题

(1)你为什么选择我们公司?
答:
贵公司是IT行业的标杆,我在校期间通过实习/项目接触过相关业务,并希望在此领域发展。公司的培训体系能帮助我快速成长。

(2)你现在手里有offer吗?
答:
目前确实有1-2个offer在流程中,但通过和您的深入交流,我发现贵司的业务方向/团队文化更符合我的长期规划(具体举例)。如果机会合适,我会优先考虑贵司。

(3)你认为一份 “好工作” 的核心要素是什么?如果工作内容与预期不符,你会如何调整?
答:
我认为好工作的核心要素包括三点:‌
‌成长性‌——行业有前景,公司有发展空间;
‌匹配度‌——岗位能发挥我的优势,同时带来挑战;
‌可持续性‌——包括薪资、文化等长期影响因素。
‌如果遇到不符预期的情况‌,我会分三步应对:
首先理性分析差异原因,其次主动沟通调整,最后根据结果决定去留。

(4)如果领导对你的工作成果提出尖锐批评,你会如何回应?
答:
我会先认真倾听领导的批评,理解他的核心诉求,确保自己没有误解他的意图。然后我会从客观角度复盘自己的工作,判断批评是否基于事实。如果是我的疏漏,我会承认错误;如果存在沟通误差,我会主动澄清。接下来,我会向领导请教具体的改进方向,并制定执行计划。例如,如果需要优化业务核心部分,我会在短时间内完成调整并反馈结果。

(5)我看你简历里写了学习能力强,你怎么证明你的学习能力强呢?
答:
我曾在实习项目中需要快速掌握Python数据分析,但此前仅有基础。我用两周时间完成《Python数据分析》,每天投入3小时,‌用项目需求倒逼学习(如用Pandas处理实际数据,每周迭代一次),‌并向团队工程师请教代码优化,并记录常见错误。结果在一个月内完成分析报告,效率提升30%(对比初期手动处理)

(6)如果你的室友在考试中,偷偷让你帮忙传递一个写着知识点的小纸条(现场监管不严,被发现概率低),你会帮吗?请说具体理由,不要只讲大道理。
答:
我不会帮忙传递纸条。考试作弊不仅违反诚信,一旦被发现会带来严重后果——比如成绩取消、处分甚至影响未来的求职背景调查。即使现场监管不严,但作弊本质上是在赌概率。如果被监控拍到、被同学举报,或者老师事后复核时发现异常,室友可能会面临更严重的处罚,而我也可能被牵连,但我可以在考前几天帮他一起复习,或者分享我的笔记。比如上次我室友考前紧张,我陪他一起梳理了重点,最后我们顺利通过了考试。

(7)你说很想进入我们公司,但你的专业和我们公司关联度不高,而且你也没有相关的实习经历。你觉得我们为什么要相信你是真心想做这个行业,而不是把这里当跳板?
答:
我专业确实与岗位不完全对口,但我在学习中培养了通用能力。比如python课程锻炼了我的编程技能,这些与贵司的岗位需求高度相关,虽然缺少行业经验,但我通过自学、实践、调研方式主动了解并补足,‌我选择贵公司是因为贵公司的业务方向与我的职业目标契合。比如贵司在IT领域的创新,让我看到长期成长空间,而非短期跳板

(8)你的成绩在班级里处于中等水平,而我们这个岗位竞争激烈,很多应聘者成绩都很优秀。你觉得自己比他们强在哪里,值得我们录用你?
答:
我的成绩确实不是顶尖,但成绩更多反映应试能力,而岗位更需要执行力、创新思维、抗压能力等,相比成绩优异的同学,我的优势在于‌实践能力‌:通过XX实习/项目积累经验;‌软技能‌:如沟通协作、快速学习;‌行业认知‌:对IT领域有深度调研,撰写行业分析报告、参与行业比赛,贵司的岗位需要抗压能力、创新思维,而我恰好通过实习经历验证过这一点。比如在时间短的高压环境下,我完成了制作方案任务,48小时内交付某方案,获得客户认可。

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())

错误:

return sum(new_d.keys())
#改正:
return sum(k for k in new_d.keys() if isinstance(k, int))

输出结果:6

(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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值