2026年互联网公司计算机技术面试技巧与答案_第1页
2026年互联网公司计算机技术面试技巧与答案_第2页
2026年互联网公司计算机技术面试技巧与答案_第3页
2026年互联网公司计算机技术面试技巧与答案_第4页
2026年互联网公司计算机技术面试技巧与答案_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2026年互联网公司计算机技术面试技巧与答案一、编程实现题(共5题,每题10分,总分50分)1.(10分)编写一个函数,实现字符串的逆序输出,不使用内置的逆序函数。示例输入:`"hello"`示例输出:`"olleh"`答案:pythondefreverse_string(s):returns[::-1]或者使用循环实现defreverse_string_loop(s):result=""forcharins:result=char+resultreturnresult测试print(reverse_string("hello"))#输出:ollehprint(reverse_string_loop("hello"))#输出:olleh解析:-使用切片`s[::-1]`是最简洁的实现方式,时间复杂度为O(n),空间复杂度为O(n)。-使用循环逐个字符拼接,同样时间复杂度为O(n),但空间复杂度可能略高。2.(10分)给定一个数组,找出其中不重复的元素,并返回它们的数量。示例输入:`[1,2,2,3,4,4,5]`示例输出:`3`(不重复的元素有1,3,5)答案:pythondefcount_unique_elements(arr):returnlen(set(arr))测试print(count_unique_elements([1,2,2,3,4,4,5]))#输出:3解析:-利用集合去重,时间复杂度为O(n),空间复杂度为O(n)。-也可以使用字典统计频率,但集合更简洁。3.(10分)实现一个简单的LRU(最近最少使用)缓存,支持get和put操作。示例输入:pythonlru=LRUCache(2)lru.put(1,1)lru.put(2,2)lru.get(1)#返回1lru.put(3,3)#去除键2lru.get(2)#返回-1(未找到)答案:pythonclassLRUCache:def__init__(self,capacity:int):self.capacity=capacityself.cache={}self.order=[]defget(self,key:int)->int:ifkeyinself.cache:self.order.remove(key)self.order.append(key)returnself.cache[key]return-1defput(self,key:int,value:int)->None:ifkeyinself.cache:self.order.remove(key)eliflen(self.cache)>=self.capacity:oldest=self.order.pop(0)delself.cache[oldest]self.cache[key]=valueself.order.append(key)测试lru=LRUCache(2)lru.put(1,1)lru.put(2,2)print(lru.get(1))#输出:1lru.put(3,3)print(lru.get(2))#输出:-1解析:-使用字典存储键值对,列表维护访问顺序。-get操作时将键移动到列表末尾,put操作时若超出容量则删除最旧的键。4.(10分)编写一个函数,判断一个二叉树是否是平衡二叉树(左右子树高度差不超过1)。示例输入:3/\920/\157示例输出:`True`答案:pythonclassTreeNode:def__init__(self,val=0,left=None,right=None):self.val=valself.left=leftself.right=rightdefis_balanced(root:TreeNode)->bool:defheight(node):ifnotnode:return0left_height=height(node.left)right_height=height(node.right)ifabs(left_height-right_height)>1orleft_height==-1orright_height==-1:return-1returnmax(left_height,right_height)+1returnheight(root)!=-1测试root=TreeNode(3)root.left=TreeNode(9)root.right=TreeNode(20)root.right.left=TreeNode(15)root.right.right=TreeNode(7)print(is_balanced(root))#输出:True解析:-递归计算左右子树高度,若高度差超过1或子树不平衡(返回-1),则整棵树不平衡。5.(10分)实现一个简单的Trie(前缀树),支持插入和查询操作。示例输入:pythontrie=Trie()trie.insert("apple")trie.insert("app")print(trie.search("apple"))#返回Trueprint(trie.search("app"))#返回Trueprint(trie.startsWith("app"))#返回Truetrie.insert("ap")print(trie.search("ap"))#返回False答案:pythonclassTrieNode:def__init__(self):self.children={}self.is_end=FalseclassTrie:def__init__(self):self.root=TrieNode()definsert(self,word:str)->None:node=self.rootforcharinword:ifcharnotinnode.children:node.children[char]=TrieNode()node=node.children[char]node.is_end=Truedefsearch(self,word:str)->bool:node=self._find(word)returnnodeisnotNoneandnode.is_enddefstartsWith(self,prefix:str)->bool:returnself._find(prefix)isnotNonedef_find(self,word:str):node=self.rootforcharinword:ifcharnotinnode.children:returnNonenode=node.children[char]returnnode测试trie=Trie()trie.insert("apple")trie.insert("app")print(trie.search("apple"))#输出:Trueprint(trie.search("app"))#输出:Trueprint(trie.startsWith("app"))#输出:Truetrie.insert("ap")print(trie.search("ap"))#输出:False解析:-Trie通过字典存储子节点,is_end标记单词结束。-插入和查询时间复杂度为O(m),m为单词长度。二、系统设计题(共2题,每题25分,总分50分)1.(25分)设计一个短链接系统,要求:-输入长链接,返回短链接(如`/abc123`)。-支持通过短链接查询原始长链接。-高并发场景下性能良好,支持每日百万级请求。要求:-说明核心组件设计(数据库、缓存、分布式等)。-简述URL编码方案和冲突处理。答案:核心组件设计:1.URL编码方案:-使用62进制(a-z,A-Z,0-9)将长链接映射为固定长度的短码(如6位)。-例如:`/example`→`/abc123`。-编码公式:`hash(长链接)%62`,映射到62字符集。2.数据库设计:-使用Redis存储短码-长链接映射,支持快速get/set操作。-若短链接数量过大,可分片存储(如按短码首字母分片)。3.高并发优化:-使用分布式缓存(RedisCluster)避免单点瓶颈。-短链接访问时先查缓存,未命中再查数据库。4.冲突处理:-若短码重复,通过自增或随机重试生成新码。-例如:若`abc123`已存在,生成`abc124`或`def456`。简述:-短链接生成通过hash算法+62进制映射,冲突概率极低。-缓存+数据库组合保证高并发下的响应速度。2.(25分)设计一个实时消息推送系统(如微信、抖音通知),要求:-支持单用户和多用户消息推送。-保证消息不丢失,可重试。-支持离线消息存储和延迟推送。要求:-说明消息队列选型(如Kafka/RabbitMQ)。-描述离线消息的存储和重试机制。答案:核心组件设计:1.消息队列选型:-使用Kafka(高吞吐、持久化)。-消息分为:实时消息(优先级高)、离线消息(延迟推送)。2.消息流程:-用户设备接入WebSocket长连接,实时消息直接推送到客户端。-离线消息存入Redis+定时任务,超时后重新入队。3.离线消息机制:-用户离线时,消息存入Redis(key=用户ID,value=消息队列ID)。-定时任务扫描Redis,超时消息重新入Kafka。-重试次数限制(如3次),避免无限循环。简述:-Kafka保证消息不丢失,通过ACK机制。-Redis+定时任务实现离线消息重试,结合消息队列实现削峰填谷。三、数据库与分布式题(共3题,每题15分,总分45分)1.(15分)SQL题:给定表`orders`(`id,user_id,amount,order_time`)和`users`(`id,name`),查询每个用户的总消费金额,并按消费金额降序排列。示例输出:|name|total_amount||-|--||Alice|150||Bob|200|答案:sqlSELECT,SUM(o.amount)AStotal_amountFROMordersoJOINusersuONo.user_id=u.idGROUPBYORDERBYtotal_amountDESC;解析:-JOIN连接订单和用户表,SUM聚合消费金额。-降序排列满足需求。2.(15分)分布式题:假设一个分布式数据库集群(如MySQLCluster),如何保证数据一致性?答案:1.主从复制:-写请求先到Master节点,同步到Slaves。-读请求可分配到Master或任意Slave。2.事务隔离级别:-使用强一致性协议(如2PC)确保跨节点事务。3.分布式锁:-使用Redis或ZooKeeper实现分布式锁,避免并发冲突。解析:-复制+隔离级别是分布式一致性的核心。3.(15分)分布式题:如何设计一个分布式缓存(如RedisCluster),解决缓存雪崩问题?答案:1.缓存预热:-起服时预加载热点数据到缓存。2.分布式锁:-缓存失效时,使用分布式锁避免同时击穿数据库。3.限流降级:-若数据库压力过大,降级为静态缓存或默认响应。解析:-缓存雪崩通过多策略缓解,避免单点失效。四、网络与操作系统题(共3题,每题15分,总分45分)1.(15分)网络题:解释TCP三次握手过程及其作用。答案:1.过程:-客户端SYN→服务器SYN+ACK→客户端ACK。2.作用:-确认双方收发能力正常。-防止已失效的连接请求干扰。解析:-握手保证可靠连接建立。2.(15分)操作系统题:解释Linux中的`fork()`和`exec()`系统调用区别。答案:-`fork()`:创建子进程,共享父进程资源(内存)。-`exec()`:替换子进程代码,子进程ID不变。cpid=fork(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论