常见IT行业技术问题+python基础训练4

📅 2026/6/23 7:48:37
常见IT行业技术问题+python基础训练4
1.技术面试题1解释 Linux 中的符号链接和硬链接答1、硬链接是原始文件的另一个目录条目指向相同的 inode 和磁盘数据块与原始文件共用同一个 inode文件元数据。删除原始文件后硬链接仍然有效数据不会丢失直到所有硬链接被删除硬链接只能在同一文件系统内创建不能跨分区或设备通常不允许对目录创建硬链接避免循环引用。2、符号链接是一个独立的文件内容为指向目标文件的路径类似 Windows 的快捷方式有自己的 inode与目标文件不同可以链接到不同分区或设备的文件或目录删除原始文件后符号链接会变成“悬空链接”指向无效路径。允许对目录创建符号链接。2Linux 使用的进程间通信方式有哪些答Linux 支持多种进程间通信IPC, Inter-Process Communication机制每种机制适用于不同的场景。以下是主要的 IPC 方式1、管道单向通信数据流式传输先进先出仅适用于父子进程或兄弟进程有共同祖先基于文件描述符fd容量有限通常 4KB。如ls -l | grep txt2、命名管道有名称的管道通过文件系统可见允许无关进程通信仍为单向通信但可持久化。mkfifo/tmp/myfifo# 创建命名管道cat/tmp/myfifo# 后台读echoHello/tmp/myfifo# 写入3、信号异步通知机制用于进程间简单事件通知如终止、中断信号编号固定如SIGKILL(9)、SIGTERM(15)。如kill -9 PID4、消息队列结构化消息传递消息类型 数据支持优先级内核持久化进程退出后消息仍保留需显式删除。msgget(),msgsnd(),msgrcv(),msgctl()// System V IPCmq_open(),mq_send(),mq_receive()// POSIX 消息队列3什么是TCP 三次握手与四次挥手答https://blog.csdn.net/2302_79818488/article/details/140211603?spm1011.2415.3001.10575sharefrommp_manage_link4ARP 协议的作用及工作原理ARPAddress Resolution Protocol地址解析协议用于将IP 地址解析为MAC 地址以便在局域网LAN中正确传输数据帧。主要功能是解决“已知目标 IP 地址但不知道其 MAC 地址”的问题。工作原理1、检查 ARP 缓存主机 A 先查看本地ARP缓存表arp -a命令可查看是否有主机 B 的 IP 对应的 MAC 地址。如果存在直接使用该 MAC 地址发送数据。如果不存在进入 ARP 请求流程。2、发送ARP请求广播主机 A 构造一个ARP 请求包包含发送方 IP 和 MAC主机 A 的地址、目标 IP主机 B 的 IP、目标 MAC 填FF:FF:FF:FF:FF:FF广播地址。通过以太网广播发送到局域网所有设备。3、接收 ARP 响应单播局域网内所有主机收到 ARP 请求但只有主机 B发现目标 IP 是自己的 IP于是将主机 A 的 IP 和 MAC 存入自己的 ARP 缓存向主机 A 发送ARP 响应包单播包含自己的 MAC 地址。其他主机丢弃该请求。4、更新 ARP 缓存并通信主机 A 收到 ARP 响应后将主机 B 的 IP 和 MAC 存入 ARP 缓存使用 MAC 地址封装数据帧开始通信。5详细阐述快速排序算法答快速排序是一种高效的分治Divide and Conquer排序算法时间复杂度为 O(n log n)是实际应用中最快的排序算法之一。其核心思想是把一个顺序错乱的序列分成两个部分左侧部分的所有元素基准值右侧部分基准值然后递归地对左右两部分排序最终合并成有序序列。算法步骤1、从数组中选取一个元素作为基准值2、分区将数组重新排列使得所有小于基准的元素移到左侧所有大于基准的元素移到右侧、基准值位于最终正确位置。3、递归排序对左右子数组重复上述过程左子数组low到pivot_index - 1右子数组pivot_index 1到high。6详细阐述归并排序算法答归并排序是一种高效的分治Divide and Conquer排序算法其核心思想是将数组递归拆分为最小单元后合并最终得到有序序列。它以稳定的O(n log n)时间复杂度著称是外部排序和大数据处理的基石。算法步骤1、分解将当前数组从中间位置分为左右两部分对左右子数组递归执行分解直到子数组长度为 1。2、合并比较两个有序子数组的元素按顺序合并到临时数组中将临时数组写回原数组的对应位置。初始化三个指针i指向左子数组起始位置j指向右子数组起始位置、k指向临时数组的当前写入位置。比较arr[i]和arr[j]将较小者放入临时数组移动对应指针将剩余未合并的元素直接拷贝到临时数组将临时数组的数据复制回原数组。7详细阐述基数排序算法答基数排序是一种非比较型整数排序算法通过逐位分配和收集实现排序时间复杂度可达O(n·k)其中 k 为数字的最大位数特别适合处理大量位数固定的整数数据。其核心思想是按位排序从最低位LSD或最高位MSD开始依次对每一位进行排序。算法步骤1、初始化确定最大数字的位数k如max_num 1234则k 4准备 10 个桶0~9用于分配数字。2、按位排序对每一位i从个位到最高位遍历数组根据当前位的数字将元素放入对应桶中例如数字123的个位是3放入桶3然后按桶顺序0→9将元素合并回原数组继续重复对下一位十位、百位等执行相同操作。8详细阐述桶排序算法答桶排序是一种分布式排序算法通过将数据分到有限数量的有序桶中对每个桶单独排序后合并结果适用于数据均匀分布的场合理想情况下时间复杂度可达O(n)。其核心思想是将待排序元素分配到若干个桶中每个桶对应一个区间范围对每个非空桶内的元素排序通常使用插入排序等简单算法按桶顺序依次取出元素得到有序序列。算法步骤1、确定桶的数量与范围根据数据分布特性选择桶数k通常k ≈ n计算每个桶的区间跨度span (max_val - min_val) / k。2、分配元素到桶中遍历数组将元素放入对应区间桶桶索引公式index (num - min_val) // span需处理边界。3、排序每个桶对每个非空桶调用排序算法如快速排序、插入排序。4、合并桶结果按桶顺序如桶0→桶1→…→桶k-1拼接有序元素。2.HR面试题1你为什么选择我们公司回答“你为什么选择我们公司”时需要展现你对公司的深入了解并将个人职业规划与公司需求精准匹配。HR最想听到应届生证明1、你比同龄人更了解我们2、你的成长曲线会更快3、你不会轻易离职。答作为计算机专业学生贵公司XX产品使用的XX技术正是我毕业设计的核心组件贵司近三年校招生晋升数据如50%三年成技术骨干证明这里有科学的培养体系虽然缺乏经验但我用1个月自学通过了XX认证在GitHub贡献过XX领域代码。如果能加入我计划在前6个月重点提升XX技能为团队分担[如自动化测试/运维监控]基础工作。2你现在手里有offer吗1、无offer时的回答技巧目前有几家公司在终面阶段如XX公司的XX岗位但贵司的业务方向与我职业规划更契合特别是[具体业务/技术栈]。如果有幸获得机会我会优先选择这里。展示市场认可度、强调公司是首选2、有竞争offer时的回答确实收到XX公司[同类岗位]的offer但贵公司的[具体项目/培养体系]更吸引我。比如你们在[技术博客/招聘页]提到的[具体内容]这与我长期发展方向一致。**“虽然某厂给出了15k的offer但贵公司的云计算容器化改造项目能让我在K8s和Service Mesh领域的积累发挥更大价值。”3、多个offer时的回答“目前有2个offer分别在A公司的运维岗和B公司的SRE岗但贵司的[混合云运维工程师]岗位完美结合了两者优势。特别是面试中了解到的[具体工作内容]这正是我理想的发展方向。”3你认为一份 “好工作” 的核心要素是什么如果工作内容与预期不符你会如何调整答1、技术可视化成长如贵司每季度要求新人主导1个技术分享并落地1个优化方案2、项目可迁移性参与的项目能形成技术博客/专利等有形产出3、反馈闭环速度代码审查反馈不超过8小时。若工作内容不符预期我会尽量用最短的时间去分析工作内容并规划好工作方案以一个提升自身的心态去面对工作。4如果领导对你的工作成果提出尖锐批评你会如何回应答首先我会立刻调整心态放下抵触情绪明确领导的批评本质是为了提升工作质量反省自己做的不好的地方与领导耐心地交流工作成果上的问题向领导询问建议然后做出一个更好的工作方案。IT 行业更看重结果导向和问题解决能力回应需避免 “讨好式认错” 或 “消极回避”而是通过 “倾听→确认→解决→复盘” 的流程传递 “理性接受反馈、高效迭代优化、对结果负责” 的职业形象让 HR 感受到你具备适配 IT 团队协作的心态和能力。“非常感谢您的批评和指导这对我来说是很重要的成长机会。我会尽快落实改进方案完成后第一时间向您汇报进展确保不影响项目整体进度。这次问题暴露了我在 XX 能力如系统设计、边界条件考虑的不足后续我会加强相关技术学习例如深入研究设计模式、参与团队的 code review 机制避免类似问题再次发生。”5我看你简历里写了学习能力强你怎么证明你的学习能力强呢IT 行业更看重 “学习的结果和实用性”避免空泛的 “我喜欢学习”而是用具体技术、时间节点、可验证的成果如项目、笔记、代码证明你不仅能学还能把学到的知识转化为解决问题的能力 —— 这正是企业招聘应届生时最看重的 “潜力”。答“我有每天花 1 小时看技术资讯的习惯比如关注‘InfoQ’‘掘金’等平台最近在深入学 Docker 容器化部署已经跟着教程完成了一个 Spring Boot 项目的容器化配置并在个人服务器上成功运行。我会把学到的知识沉淀下来比如在 GitHub 上整理了‘Java 并发编程笔记’包含线程池原理、锁机制等内容目前有 100 星标也通过和其他开发者的交流发现了自己理解的漏洞倒逼自己深入学习。“ “对我来说强学习能力体现在三点一是目标拆解能力把复杂技术拆成‘基础概念→核心用法→实战场景’的步骤二是问题驱动意识遇到不懂的先独立排查再精准求助三是输出倒逼输入比如写技术博客、参与开源项目。这些方法让我在面对新领域时能快速上手这也是我自信能适应 IT 行业快速变化的原因。”6如果你的室友在考试中偷偷让你帮忙传递一个写着知识点的小纸条现场监管不严被发现概率低你会帮吗请说具体理由不要只讲大道理。答“帮他” 其实是在害他。他找我传纸条本质是想走捷径。这次帮了他会觉得 “投机取巧能过关”下次可能更不认真复习甚至依赖作弊。但大学里的知识比如 IT 专业的编程基础、算法逻辑是环环相扣的这次蒙混过关后面学更难的内容会跟不上工作后遇到实际问题也解决不了 —— 到时候没人能帮他传纸条坑的是他自己的前途。7你说很想进入我们公司但你的专业和我们公司关联度不高而且你也没有相关的实习经历。你觉得我们为什么要相信你是真心想做这个行业而不是把这里当跳板答我不会把贵公司当跳板也确实是真心想进入这个行业。选择贵公司是因为你们的业务刚好能接住我的 “起步需求”。我知道自己没相关实习经历缺的是真实项目经验和团队协作机会。贵公司做的企业级 SaaS 产品前端需要对接各种复杂的业务逻辑这正是我想学习的而且你们官网上写的 “新人导师制”能让我跟着资深开发做需求这种成长环境是我最看重的。对我来说现在最需要的是 “把自学的东西落地”而不是 “快速跳槽涨薪”—— 跳板的目的是 “利用平台跳向更好的”但我现在的目标是 “在平台里扎根学东西”这和跳板的逻辑完全反着。简单说我不是 “没得选才来”而是 “选了这个行业又选了你们公司”与其说怕我当跳板不如说我更怕 “没机会证明自己能留下来”—— 如果能入职我肯定会抓住机会把事做好毕竟这是我自己选的路。8你的成绩在班级里处于中等水平而我们这个岗位竞争激烈很多应聘者成绩都很优秀。你觉得自己比他们强在哪里值得我们录用你我理解成绩是衡量学习状态的重要指标优秀的成绩确实能体现扎实的理论基础和自律性这一点我很佩服他们。但结合咱们岗位对“解决实际问题”和“快速落地能力”的要求我想我的优势可能在这几个具体的地方 第一我把更多精力放在了“理论到实践的转化”上。比如专业课里学数据结构时班里同学可能更专注于考高分我却花了两个月用Python复现了教材里的10种排序算法还做了个可视化工具——用户输入数据量后能直观看到不同算法的耗时差异。后来这个小工具被老师推荐给了下一届学弟帮他们理解算法效率。对IT岗位来说“能把课本上的逻辑写成可运行的代码”可能比“记住考点拿高分”更贴近实际工作需求。 第二我更擅长在“遇到问题时主动破局”。成绩好的同学可能更擅长应对标准化考试但实际开发中经常遇到“课本没讲过”的问题。比如我去年做毕设时需要用Flask框架对接一个第三方API文档全是英文且有歧义卡了三天没进展。我没等着老师给答案而是去GitHub找同类项目源码、在Stack Overflow发帖提问甚至加了个Flask开发者社群最后用一周时间啃懂了逻辑还总结了一份“API对接避坑指南”发在博客上现在有近千次浏览。这种“遇到坎不慌主动找解法”的习惯可能比“考试能答对标准答案”更适合需要持续解决突发问题的岗位。 第三我对岗位所需技能的“针对性积累”更聚焦。我知道成绩中等是短板所以从大二开始就瞄准咱们行业补技能自学了Java和Spring Boot做过一个校园二手书交易小程序用户能在线下单、查看附近自提点后端用MySQL存数据还跟着B站的运维课程练过Linux命令现在能独立部署简单的服务器环境。这些技能可能没反映在成绩单上但刚好能匹配岗位要求的“基础开发简单运维”能力——毕竟工作中“能直接上手写代码、搭环境”可能比“成绩单上的分数”更能快速创造价值。 其实我一直觉得成绩是“过去学习状态的总结”但岗位需要的是“未来能解决问题的人”。我或许不是理论最扎实的但一定是“拿到任务后会想尽办法落地、甚至超预期完成”的那种人——这可能就是我和成绩优秀的同学相比更贴合咱们岗位需求的地方。3.问答题1执行以下代码输出结果是什么defprocess_list(lst):foriinrange(len(lst)):iflst[i]%20:lst.insert(i1,lst[i]//2)returnlst nums[2,3,8]print(process_list(nums))i lst[i]insert i lst[i]02//200213111//2!02823//2!038#输出结果为[2,1,3,8]2运行下列代码输出结果是什么defmodify_tuple(t):try:t[1]10except:t(t[0],t[1]10,t[2])returnt tup(1,5,3)new_tupmodify_tuple(tup)print(tup[1]new_tup[1])tup(1,5,3)ttup,t[1]10# 元组中元素不可更改此处代码捕获异常给到except语句处理t(t[0],t[1]10,t[2])t(1,510,3)t(1,15,3)#t重新指向新的元组地址new_tupmodify_tuple(tup)t#new_tup指向t的元组地址tup[1]5,new_tup[1]15tup[1]new_tup[1]20#输出结果为:203以下代码的输出结果是什么defset_operations():a{1,2,3}ba.copy()a.add(4)b.discard(2)ca-b b.update(c)returnlen(ab)print(set_operations())a{1,2,3}ba.copy()# 在 Python 中集合的 copy() 方法属于浅拷贝shallow copy但由于集合的元素必须是不可变对象如整数、字符串、元组等浅拷贝在这种情况下等同于深拷贝的效果。 所以a{1,2,3} b{1,2,3}a与b是两个不同的对象a.add(4)# 添加新元素a{1,2,3,4} b{1,2,3}b.discard(2)# 删除指定元素b{1,3} a{1,2,3,4}ca-b# 取结合a与b的差集c{2,4}bupdate(c)# 在b集合原有元素的基础上加入c集合中的元素。b{1,2,3,4}ab{1,2,3,4}# a与b做交集运算#输出结果为44执行下列代码后输出结果是什么defstring_transform(s):result[]fori,charinenumerate(s):ifi%20:result.append(char.upper())else:result.append(char.lower())return.join(result[::-1])print(string_transform(PyThOn))i char result0%20P.upper()P1%2!0y.lower()y2%20T.upper()T3%2!0h.lower()h4%20O.upper()O5%2!0n.lower()nresult[P,y,T,h,O,n]result[::-1][n,O,h,T,y,P].join(result[::-1])nOhTyP#输出结果为nOhTyP5运行以下代码输出结果是什么defdict_processing():d{a:1,b:2,c:3}new_d{}fork,vind.items():new_d[v]kifv%20:new_d[k.upper()]v*2returnsum(new_d.keys())print(dict_processing())kav1new_d[1]a1%2!0kbv2new_d[2]b2%20new_d[B]2*24kcv3new_d[3]c3%2!0new_d{1:a,2:b,B:4,3:c}new_d.keys()([1,2,B,3])sum(new_d.keys())12B3#TypeError: unsupported operand type(s) for : int and str#输出结果为Traceback(most recent call last): FileD:\PythonCode\Work\Test.py, line13,inmoduleprint(dict_processing())~~~~~~~~~~~~~~~^^ FileD:\PythonCode\Work\Test.py, line10,indict_processingreturnsum(new_d.keys())TypeError: unsupported operand type(s)for:intandstr6以下代码的输出结果是什么defnested_list_operation():matrix[[1,2],[3,4],[5,6]]total0foriinrange(len(matrix)):matrix[i].append(matrix[i-1][0])totalsum(matrix[i])returntotalprint(nested_list_operation())i matrix[i-1][0]matrix[i]total05[1,2,5]125811[3,4,1]83411623[5,6,3]1656330#输出结果为307执行下列代码会产生什么结果deftuple_unpacking():tup(10,20,30,40)a,*b,ctup b.append(c//a)returntuple(b)print(tuple_unpacking()[1]*2)#元组特性不可变对象有序可以存储任意数据类型通过角标访问元素元组内的数据不能修改除非该数据是可变对象该可变对象的内容可以修改底层数据结构为满状态的数组tup(10,20,30,40)a,*b,ctupa10,b[20,30],c40#*b表示一种解包语法带 * 的变量像这里的 *b 会把序列中 “剩下未被单独匹配” 的元素统一打包成一个列表。你可以理解成元组被拆成 单独元素给 a 中间剩余元素打包给 b 单独元素给 c 所以 b 就成了 [20, 30] 这就是 Python 灵活的解包语法在起作用b.append(c // a)c//a40//104,b[20,30,4]tuple(b)b(20,30,4)tuple(b)[1]*2b[1]*230*260#输出结果为608运行以下代码输出结果是什么defset_generator():sset()foriinrange(5):ifi%20:s.add(i)else:s.update(range(i))returnsorted(s)[-2]print(set_generator())#集合特性可变对象无序数据元素不重复只能存储不可变数据或能够被哈希的数据不支持角标操作可以增删底层数据结构为哈希表/散列表#以下过程从左到右从下到上看i i %2s.add(i)range(i)s.update00s{0}1≠00s{0}20s{0,2}3≠00,1,2s{0,2,1}40s{0,2,1,4}#最终s{0,2,1,4}sorted(s)[-2]{0,1,2,4}[-2]2#输出结果29以下代码的输出结果是什么defstring_manipulation():sHello World Pythonwordss.split()result[]forwordinreversed(words):result.append(word[1:-1]iflen(word)2elseword)return .join(result)print(string_manipulation())wordss.split()words[Hello,World,Python]reversed(words)[Python,World,Hello]word len(word)word[1:-1]resultPython62ytho[ython]World52orl[ython,orld]Hello52ell[ython,orld,ello]#最终result[ython,orld,ello]#输出结果为ytho orl ell10执行下列代码后输出结果是什么defdict_traversal():d{x:5,y:10,z:15}keyslist(d.keys())forkeyinkeys:ifd[key]8:d[key.upper()]d.pop(key)returnlen(d)sum(d.values())print(dict_traversal())#字典特性可变对象无序键只能是不可变/能够被哈希的数据值随意存不支持角标操作可以增删查改底层数据结构为哈希表/散列表keys[x,y,z]key d[key]d[key.upper()]d.pop(key)d x58{x:5,y:10,z:15}y108d[Y]10{x:5,Y:10,z:15}z158d[Z]15{x:5,Y:10,Z:15}#最终d{x:5,Y:10,Z:15}len(d) sum(d.values)3(51015)#输出结果为33