python列表元组字典练习

1.技术面试题

(1)解释 Linux 中的符号链接和硬链接

在 Linux 系统中,链接(Link)是一种访问文件的方式,主要分为符号链接(又称软链接)硬链接 两种。

硬链接是文件系统中多个文件名指向同一个inode(文件的元数据索引节点)的机制。

  • 特性
    • 硬链接与原文件共享相同的 inode 和数据块,本质上是同一个文件的不同名称。
    • 删除原文件后,硬链接仍然有效(因为 inode 只有在所有链接都被删除后才会释放)。
    • 不能跨文件系统创建(因为不同文件系统有独立的 inode 编号空间)。
    • 不能链接目录(避免文件系统循环和混乱)。
    • 硬链接的权限、所有者等属性与原文件一致(因为共享 inode)。

符号链接是一个独立的特殊文件,其内容是指向另一个文件或目录的路径(类似于 Windows 的快捷方式)。

  • 特性
    • 软链接有自己独立的 inode,存储的是目标文件的路径(而非数据)。
    • 如果原文件被删除或移动,软链接会失效(变成 “断链”,显示为红色闪烁)。
    • 可以跨文件系统创建(因为只记录路径)。
    • 可以链接目录(常用作目录快捷方式)。
    • 软链接的权限通常显示为 lrwxrwxrwx,但实际访问权限由目标文件决定。

(2)Linux 使用的进程间通信方式有哪些?

管道:分为:匿名管道,命名管道

信号:一种异步通信机制,用于通知进程发生了某种事件。

共享内存:是速度最快的IPC(进程通讯方式)方式.

消息队列:内核维护的一个信息链表,进程可按类型发送/接收消息(类似“信箱”)。

信号量:实现进程间同步与互斥(控制对共享资源的访问)。

套接字:最初为网络通信设计,也可以用于同一个主机上的进程间通信(通过AF_UNIX域协议)。

另外还有:内存映射文件UNIX域套接字

(3)什么是TCP 三次握手与四次挥手?

TCP(传输控制协议)是一种面向连接、可靠的传输层协议,在数据传输前需要通过 “三次握手” 建立连接,传输结束后通过 “四次挥手” 释放连接。这两个过程是保障 TCP 可靠性的核心机制。

三次握手

第一次握手(客户端 → 服务器):客户端向服务器发送一个 SYN(同步序列编号) 报文,此时客户端状态变为SYN-SENT(等待服务器确认).

第二次握手(服务器→客户端):服务器收到SYN报文后,确认客户端的请求,回复一个SYN-ACK报文,此时服务器状态变为SYN-RECELVED(等待客户确认).

第三次握手(客户端→服务器)

客户端收到SYN-RECEIVED报文后,向服务器发送一个ACK(确认)报文,客户端状态变为 ESTABLISHED(连接建立);服务器收到 ACK 后,也进ESTABLISHED 状态,双方开始传输数据。

四次挥手

第一次挥手(客户端 → 服务器):客户端数据发送完毕,向服务器发送 FIN(结束)报文,客户端状态变为 FIN-WAIT-1(等待服务器确认)

第二次挥手(服务器 → 客户端):服务器收到 FIN 后,回复 ACK 报文。服务器状态变为 CLOSE-WAIT(等待自身数据发送完毕)客户端状态变为 FIN-WAIT-2(等待服务器的 FIN)

第三次挥手(服务器 → 客户端):服务器数据发送完毕,向客户端发送 FIN 报文,服务器状态变为 LAST-ACK(等待客户端确认)

第四次挥手(客户端 → 服务器):客户端收到 FIN 后,回复 ACK 报文,客户端状态变为 TIME-WAIT之后进入 CLOSED;服务器收到 ACK 后,直接进入 CLOSED 状态。

(4)ARP 协议的作用及工作原理

作用

  1. 正向地址解析:根据已知的 IP 地址,查询对应的 MAC 地址,这是 ARP 最主要的功能。
    例如,当主机 A 需要向同一局域网内的主机 B 发送数据时,若 A 已知 B 的 IP 地址但不知道其 MAC 地址,就会通过 ARP 协议获取 B 的 MAC 地址,确保数据帧能准确送达。
  2. 维护 ARP 缓存表:本地设备会将解析到的 IP 地址与 MAC 地址的映射关系临时存储在 ARP 缓存表中,避免重复解析,提高通信效率。缓存表中的条目有过期时间(通常为 15-300 秒),过期后会被自动删除。

工作原理

1,主机 A 首先查询自己的 ARP 缓存表,看是否存在主机B的IP地址,若存在且未过期,直接使用该 MAC 地址封装数据帧并发送。若不存在或已过期,则进入下一步。

2,主机 A 构造一个 ARP 请求报文,该报文通过广播方式发送到局域网内的所有设备(交换机转发广播帧,所有设备均可接收)。

3,主机 B 收到请求后,发现目标 IP 与自己的 IP 一致,便会将主机 A 的 IP 和 MAC 映射存入自己的 ARP 缓存表(避免后续通信时重复查询),然后构造 ARP 应答报文。

4,主机B发送ARP 应答报文该报文以单播方式直接发送给主机 A(而非广播)。

5,主机 A 收到应答后,将主机 B 的 IP 和 MAC 映射存入自己的 ARP 缓存表,随后即可使用该 MAC 地址封装数据帧,通过交换机转发给主机 B,完成通信。

(5)详细阐述快速排序算法

快速排序的核心是选择一个 “基准值”,然后将数组分为两部分:

  • 左部分:所有元素小于基准值
  • 右部分:所有元素大于基准值

接着对左右两部分递归执行相同的操作,直到子数组长度为 0 或 1(天然有序),最终整个数组被排序。

(6)详细阐述归并排序算法

归并排序的核心思路可以概括为三个步骤:

  1. 分解:将原始数组递归地分成两个规模大致相等的子数组,直到每个子数组只包含一个元素(单个元素天然有序)。
  2. 解决:当子数组无法再分解时,开始逐步合并这些有序的子数组。
  3. 合并:将两个已排序的子数组合并成一个更大的有序数组,重复此过程直到得到完整的有序数组。

(7)详细阐述基数排序算法

基数排序的核心是按 “位” 排序,即从数据的最低有效位(或最高有效位)开始,依次对每一位进行排序,直到所有位都处理完毕。每一轮排序都基于当前位的值,将元素分配到不同的 “桶” 中,再按桶的顺序重新组合元素。

根据处理位的顺序,基数排序可分为:

  • LSD:从最低有效位开始(如个位→十位→百位),适用于整数排序。
  • MSD:从最高有效位开始(如百位→十位→个位),适用于字符串排序。

(8)详细阐述桶排序算法

桶排序的核心思路可以分为三个步骤:

  1. 创建桶:根据数据的范围和分布,创建若干个有序的空桶。
  2. 分配数据:将待排序的元素按照一定的映射规则分配到对应的桶中。
  3. 排序与合并:对每个非空桶内的元素进行排序(可使用其他排序算法),然后按桶的顺序依次合并所有桶中的元素,得到最终的有序序列。

2.HR面试题

(1)你为什么选择我们公司?

贵公司在这个*领域的布局和投入,与我的职业目标高度契合,我相信在这里能接触到最前沿的实践,实现个人能力的快速成长。贵公司招聘的 *岗位,的要求,这与我掌握的能力高度匹配。我通过之前的学习也能快速适应该岗位.同时贵公司在某某领域的发展和前景,也对我十分有吸引力,我相信我在这里会有更好的发展.

(2)你现在手里有offer吗?

目前确实收到了其他公司的 offer,主要集中在 [行业领域,如互联网 / 新能源],但经过对贵公司的深入了解 —— 尤其是 [具体吸引点,如核心业务方向、团队氛围、岗位发展空间],我认为这里更符合我的职业规划。相比之下,我更看重贵公司 [具体优势,如在某领域的技术积累、对新人的培养机制],所以目前正优先推进与贵公司的沟通,希望能有机会加入团队。

(3)你认为一份 “好工作” 的核心要素是什么?如果工作内容与预期不符,你会如何调整?

好工作的核心要素:价值匹配,成长空间,基础保障.如果工作内容与预期不符我会先沉下心了解具体差异,如果差距过大,会主动和领导沟通,减少不必要的能力资源浪费.如果差距较小,我会通过对工作内容的判断进行自我调整,和快速适应.以达到工作要求.

(4)如果领导对你的工作成果提出尖锐批评,你会如何回应?

首先会专注听完领导的批评,不打断、不反驳,甚至可以边听边记录关键点,听完后,先针对明确的问题表达认同,不回避责任(即使有客观原因,也先聚焦自身可改进的部分)。在承认问题后,紧接着说明接下来的改进计划,让领导看到你不仅接受批评,更有解决问题的方案。如果暂时没思路,也可以主动请教,体现积极性。回应的最终目的是解决问题,所以后续会按计划落实改进,并在完成后主动反馈

(5)我看你简历里写了学习能力强,你怎么证明你的学习能力强呢?

我的学习能力不是“记住多少知识”,而是知道我所处的情况下知道自己要学什么,怎么学,以及如何运用所学知识解决问题。就像我在大学期间的(遇到了什么问题,我对这个问题的看法,以及为了解绝问题我所做的努力,及方法)这些都可以证明我的学习能力。

(6)如果你的室友在考试中,偷偷让你帮忙传递一个写着知识点的小纸条(现场监管不严,被发现概率低),你会帮吗?请说具体理由,不要只讲大道理。

首先我不会帮助他,因为我觉得考试所检查的是个人实力,就像公司的笔试,如果通过作弊的手段通过的测试,就说明其能力不够,在以后的工作中也会体现出来,从而被淘汰。其次尽管被发现的概率低,我也不会为了帮助他而冒着会使自己陷入不必要的麻烦。而且当他让我帮助他作弊时也就没有考虑我是否会因此而被连累,这样的人也不值得我为他冒险。

(7)你说很想进入我们公司,但你的专业和我们公司关联度不高,而且你也没有相关的实习经历。你觉得我们为什么要相信你是真心想做这个行业,而不是把这里当跳板?

对我来说,留在贵公司能获得 “专业能力 + 行业资源 + 价值认同” 的三重成长,这比 “跳去其他地方” 更有长期价值。而跳板的逻辑是 “此处只是垫脚石”,但我看到的是 “此处就是目的地”。

最后想说:专业和实习经历的不足,我承认是短板,也做好了 “从基础岗位做起、比别人更努力补差距” 的准备。但这份 “非顺理成章” 的选择背后,是经过验证的热情、主动付出的成本,以及对贵公司的深度认同 —— 这些,或许比 “天然匹配” 更能证明我不会轻易离开。

(8)你的成绩在班级里处于中等水平,而我们这个岗位竞争激烈,很多应聘者成绩都很优秀。你觉得自己比他们强在哪里,值得我们录用你?

成绩,更多是 “过去学习状态的证明”,但工作需要的是 “未来能产出什么”。

当然,我也清楚理论基础的重要性,所以最近也在补相关的专业书,但我更相信:比起 “成绩优秀但需要重新适应实践场景”,我这种 “带着实践经验进来,能快速上手解决具体问题” 的人,可能更能快速为团队创造价值。

最后想说:成绩确实是我的短板,我也不会回避。但如果岗位需要的是 “能把事做成的人”,而不是 “能考高分的人”,那我在实践中积累的 “解决问题的逻辑、落地执行的能力、主动调整的灵活性”,或许正是比 “成绩优秀” 更适配的优势。我也愿意用试用期的表现证明:这些积累,能实实在在转化为工作成果。

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

错误

(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、付费专栏及课程。

余额充值