1.技术面试题

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

答:

硬链接:与原文件共享同一 inode,本质是同一文件的不同 “入口”;删除原文件不影响硬链接,需删完所有硬链接才真正删除文件。

符号链接:类似 “快捷方式”,有独立 inode,保存原文件路径;删除原文件,符号链接失效。

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

答:

管道(Pipe):单向数据流,父子进程或兄弟进程间用(如 | 命令)。

命名管道(FIFO):有文件名的管道,不同进程(无亲缘关系)可通过路径访问。

消息队列:进程间按 “消息” 收发数据,可按类型 / 优先级管理。

共享内存:多进程共享同一块内存,速度最快(需同步机制,如信号量)。

信号量:用于进程间同步 / 互斥(如控制共享资源访问,避免冲突)。

套接字(Socket):支持同一主机或跨网络的进程通信(如网络编程的 TCP/UDP)。

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

答:

三次握手(建立连接)

客户端发 SYN(请求连接)→ 服务端;

服务端回 SYN+ACK(同意连接 + 请求同步)→ 客户端;

客户端发 ACK(确认同步)→ 服务端。
作用:确保双方收发能力正常,为传输数据做准备。

四次挥手(断开连接)

主动方发 FIN(请求断开)→ 被动方;

被动方回 ACK(确认断开请求);

被动方发 FIN(被动方准备好断开)→ 主动方;

主动方回 ACK(确认断开)。
作用:因 TCP 全双工,需双向确认 “都不再发数据”,彻底释放连接。

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

答:

作用:将 IP 地址转换为 MAC 地址(链路层通信需 MAC 地址)。

原理:

主机发 ARP 请求广播(“谁有目标 IP?求 MAC”);

对应 IP 的主机回 ARP 响应单播(“我有,MAC 是 XX”);

发起方缓存 ARP 映射(IP→MAC),后续直接用。

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

答:

  • 核心思想:选 “基准值”,分区(比基准小放左、大的放右),递归排序左右子数组。
  • 步骤:
    1. 选基准(如数组首元素);
    2. 分区:遍历数组,小的放左、大的放右;
    3. 递归排序左右分区。
  • 特点:平均时间复杂度 O(nlogn),最坏 O(n2)(基准选得极差);原地排序(少额外空间),不稳定(相同元素可能因基准交换打乱顺序)。

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

答:

  • 核心思想:分治,拆分数组为子数组,递归排序子数组,最后合并有序子数组。
  • 步骤:
    1. 拆分:数组不断二分,直到子数组长度为 1(天然有序);
    2. 合并:两两合并有序子数组,直到合并成原数组长度。
  • 特点:时间复杂度稳定 O(nlogn);非原地排序(需额外空间存合并结果),稳定(相同元素相对顺序保留)。

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

答:

  • 核心思想:按 “位” 排序(如个位→十位→百位…),用计数 / 桶排序处理每一位。

  • 步骤

    (以十进制整数为例):

    1. 个位数值,用计数排序分组;
    2. 十位数值,重复分组;
    3. 直到最高位,最终合并有序。
  • 特点:非比较排序,时间复杂度 O(d×n)(d 是位数);适合整数 / 固定格式字符串排序,需额外空间,稳定。

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

答:

  • 核心思想:划分 “桶”(如按数值范围分区间),将元素放入对应桶,桶内排序后合并。
  • 步骤:
    1. 确定桶数量和范围(如 0-10、11-20…);
    2. 元素按值入桶;
    3. 桶内用排序算法(如插入排序),合并所有桶。
  • 特点:时间复杂度 O(n+k)(k 是桶数),依赖 “数据均匀分布”;适合范围小、分布均匀的数据,需额外空间存桶,稳定(实现时控制相同元素顺序)。

2.HR面试题

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

答:贵公司在 [具体领域] 的 [具体成果,行业前沿技术布局],一直是我关注学习的方向。我对 [岗位相关工作] 很感兴趣,也积累了 [对应能力,技术知识 / 实践经验],相信能在贵公司的平台上,把能力落地,和团队一起创造价值,所以特别想加入。

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

答:

有其他 offer:目前有 [公司名称] 的意向,但贵公司是我最心仪的。贵司在 [行业 / 业务 / 文化等吸引点] 上的优势,和我职业规划高度契合,若有幸加入这里,我会果断选择贵司,全心投入。

没有其他 offer:目前还没确定的录用意向,一直在专注准备贵司的面试,因为从 [了解到的公司优势] 来看,这里是我最想加入、能让我发挥价值的平台,也期待能得到贵司的认可 。

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

答:

核心要素:能让人在工作中持续成长,有清晰的价值产出(成果被认可),且工作与生活能动态平衡,不长期互相挤压。

调整方法:先主动和上级 / 同事沟通,明确岗位真实需求;再快速梳理自身能力,找现有技能与新工作的结合点,通过学习补足差异部分;过程中保持开放心态,把调整当成长机会,积极适配新内容。

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

答:

我会先诚恳回应:“您批评得对,这次工作确实没做好,责任在我,我马上梳理问题。” 接着主动追问:“您觉得核心问题出在哪?比如是逻辑漏洞还是执行偏差,希望您给我指明白,我好针对性改。” 最后表态:“我会优先处理,今晚就出调整方案,明天一早给您汇报,保证把问题解决好。” 用认错、求指导、给行动的思路,展现担当和解决问题的决心。

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

答:

暑期返家乡在街道党政办实践时,领导安排我录入党员档案并分类归档,这是我完全陌生的领域。面对 “入党志愿书、思想汇报、转正批复” 等陌生材料和对应的分类文件夹,我先快速翻看已整理好的档案找规律,对不确定的地方立刻请教同事,比如 “预备党员考察表该归入党发展类还是日常管理类”,明确标准后马上记在手机备忘录里。仅用 10 分钟就吃透分类逻辑,后续高效完成了 30 多份档案的录入分类,没再出过错。这个过程能体现我面对新事物时,能快速通过观察、请教抓住核心规则,短时间内掌握方法并落地执行的学习能力。

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

输出结果:10

(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

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐