联想工程师面试问题及答案_第1页
联想工程师面试问题及答案_第2页
联想工程师面试问题及答案_第3页
联想工程师面试问题及答案_第4页
联想工程师面试问题及答案_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

2026年联想工程师面试问题及答案一、编程基础(3题,每题10分,共30分)1.题目:编写一个函数,实现字符串的翻转,不使用内置的翻转函数。例如,输入`"abcdef"`,输出`"fedcba"`。答案:pythondefreverse_string(s:str)->str:returns[::-1]示例print(reverse_string("abcdef"))#输出:fedcba解析:使用Python的切片操作`[::-1]`可以高效翻转字符串,时间复杂度为O(n),空间复杂度为O(n)。2.题目:实现一个函数,检查一个整数是否为素数。如果是素数,返回`True`,否则返回`False`。答案:pythondefis_prime(n:int)->bool:ifn<=1:returnFalseifn==2:returnTrueifn%2==0:returnFalseforiinrange(3,int(n0.5)+1,2):ifn%i==0:returnFalsereturnTrue示例print(is_prime(17))#输出:Trueprint(is_prime(18))#输出:False解析:素数定义为大于1且仅能被1和自身整除的数。检查时,先排除小于等于1、偶数(除2外),然后只需检查到`√n`即可,提高效率。3.题目:实现一个函数,找出列表中重复的元素,并返回一个包含重复元素的列表。例如,输入`[1,2,2,3,4,4,5]`,输出`[2,4]`。答案:pythondeffind_duplicates(lst:list)->list:seen=set()duplicates=set()fornuminlst:ifnuminseen:duplicates.add(num)else:seen.add(num)returnlist(duplicates)示例print(find_duplicates([1,2,2,3,4,4,5]))#输出:[2,4]解析:使用集合`seen`记录已出现过的元素,遇到重复的元素则加入`duplicates`集合。最后返回`duplicates`列表,时间复杂度为O(n)。二、算法设计(3题,每题10分,共30分)1.题目:给定一个整数数组,返回数组中和为特定值的三元组数量。例如,输入`[-1,0,1,2,-1,-4]`和目标值`0`,输出`4`(即`(-1,-1,2),(-1,0,1),(0,1,-1),(0,2,-2)`)。答案:pythondefthree_sum(nums:list,target:int)->int:nums.sort()count=0n=len(nums)foriinrange(n-2):ifi>0andnums[i]==nums[i-1]:continueleft,right=i+1,n-1whileleft<right:total=nums[i]+nums[left]+nums[right]iftotal==target:count+=1left+=1right-=1whileleft<rightandnums[left]==nums[left-1]:left+=1whileleft<rightandnums[right]==nums[right+1]:right-=1eliftotal<target:left+=1else:right-=1returncount示例print(three_sum([-1,0,1,2,-1,-4],0))#输出:4解析:排序后使用双指针法,时间复杂度为O(n²)。避免重复解的方法是跳过相同的数字。2.题目:实现一个LRU(最近最少使用)缓存,支持`get`和`put`操作。缓存容量为`capacity`。例如,容量为2的缓存:`put(1,1)`→`put(2,2)`→`get(1)`→`put(3,3)`→`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`时若超出容量则删除最旧的元素。3.题目:给定一个二叉树,找出最长的路径,该路径中的节点具有连续的值。例如,输入`[5,4,5,1,1,5]`的二叉树,最长连续路径为`[5,4,5]`,长度为3。答案:pythonclassTreeNode:def__init__(self,val=0,left=None,right=None):self.val=valself.left=leftself.right=rightdeflongest_consecutive(root:TreeNode)->int:ifnotroot:return0self.max_len=0defdfs(node:TreeNode,parent_val:int,current_len:int):ifnode:ifnode.val==parent_val+1:current_len+=1else:current_len=1self.max_len=max(self.max_len,current_len)dfs(node.left,node.val,current_len)dfs(node.right,node.val,current_len)dfs(root,root.val-1,0)returnself.max_len示例构建二叉树[5,4,5,1,1,5]root=TreeNode(5)root.left=TreeNode(4)root.right=TreeNode(5)root.left.left=TreeNode(1)root.left.right=TreeNode(1)root.right.right=TreeNode(5)print(longest_consecutive(root))#输出:3解析:深度优先搜索(DFS)遍历树,记录当前连续长度,并更新最大值。每次遇到不连续的值时重置长度。三、系统设计(1题,20分)1.题目:设计一个简单的微博系统,支持用户发布微博、关注/取消关注、查看关注者的微博。要求说明核心模块、数据结构、接口设计,并考虑高并发场景下的优化。答案:核心模块:1.用户模块:管理用户信息(ID、昵称、关注列表等)。2.微博模块:管理微博发布、存储、检索。3.关系模块:管理关注关系。4.缓存模块:加速热点数据访问。5.消息队列:异步处理高并发写入。数据结构:-用户:`{user_id:{name,followings,followers,tweets}}`-微博:`{tweet_id:{user_id,content,timestamp}}`-关注:`{user_id:{followings}}`接口设计:-`publish_tweet(user_id,content)`:发布微博。-`follow(user_id,target_id)`:关注用户。-`unfollow(user_id,target_id)`:取消关注。-`get_tweets(user_id)`:获取用户微博(分页)。高并发优化:1.缓存:使用Redis缓存热点用户微博。2.异步写入:通过Kafka/RabbitMQ处理发布消息,降低数据库压力。3.分片:按用户ID分片微博数据,提高读写性能。4.限流:对频繁操作(如发布)进行限流。解析:微博系统需支持高并发读写,核心在于合理设计数据结构和异步处理。缓存和分片是关键优化手段。四、数据库(2题,每题10分,共20分)1.题目:解释SQL中的`JOIN`类型,并说明在哪些场景下使用`LEFTJOIN`和`RIGHTJOIN`。答案:`JOIN`类型包括:-INNERJOIN:仅返回两个表都匹配的行。-LEFTJOIN:返回左表所有行,右表匹配行;否则右表为`NULL`。-RIGHTJOIN:返回右表所有行,左表匹配行;否则左表为`NULL`。-FULLJOIN:返回两个表的所有行,不匹配的为`NULL`。场景:-LEFTJOIN:查询左表所有数据,即使右表无匹配(如用户信息+无订单的用户)。-RIGHTJOIN:反向场景(如查询所有订单,即使用户不存在)。解析:`LEFTJOIN`和`RIGHTJOIN`主要区别在于保留哪张表的全部数据。选择取决于业务需求。2.题目:设计一张用户表(`users`),包含用户ID(主键)、昵称、注册时间、性别、城市。写出创建表的SQL语句,并说明索引优化的原则。答案:sqlCREATETABLEusers(user_idINTPRIMARYKEYAUTO_INCREMENT,nicknameVARCHAR(50)NOTNULL,register_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMP,genderENUM('male','female','other'),cityVARCHAR(100));CREATEINDEXidx_cityONusers(city);CREATEINDEXidx_genderONusers(gender);索引优化原则:1.选择性高:高基数的列(如`city`)。2.查询频繁:常用作过滤条件的列(如`gender`)。3.避免冗余:不要对非筛选列建索引。解析:索引能加速查询,但需权衡性能和存储成本。主键自动索引,常用筛选列单独索引。五、操作系统(2题,每题10分,共20分)1.题目:解释进程和线程的区别,并说明在哪些场景下使用多线程优于多进程。答案:-进程:独立内存空间,资源分配单元。-线程:进程内执行单元,共享内存空间,轻量级。多线程优势场景:1.I/O密集型:如网络请求,线程阻塞不阻塞其他线程。2.共享数据:线程间通信开销小(如游戏内存同步)。3.快速响应:如GUI界面保持流畅。解析:多线程适合共享数据和并发I/O,但需注意线程安全问题。多进程适合计算密集型任务。2.题目:简述Linux中的`fork()`系统调用,并说明父子进程的执行流程。答案:`fork()`创建子进程,父进程返回子进程ID,子进程返回0。-父进程:继续执行,可等待子进程(`wait()`)。-子进程:可修改共享数据(需加锁)。流程:1.父进程调用`fork()`。2.系统复制父进程内存(写时复制)。3.子进程修改数据后写入新内存。4.父子独立执行。解析:`fork()`是Linux核心机制,但需注意资源复制和同步问题。六、网络(2题,每题10分,共20分)1.题目:解释TCP三次握手过程,并说明为何不能直接使用四次握手。答案:三次握手:1.`SYN`:客户端→服务器,请求连接。2.`SYN-ACK`:服务器→客户端,同意连接。3.`ACK`:客户端→服务器,确认连接。为何不能四次:-三次能保证双方收发能力。四次会引入冗余等待。-第三次`ACK`若丢失,重发机制需额外轮次。解析:三次握手是最低效率但可靠的方案,四次握手无实际收益。2.题题:说明HTTP和HTTPS的主要区别,以及HTTPS为何需要证书。答案:-HTTP:明文传输,易被窃听。-HTTPS:加密传输(TLS/SSL),需证书验证身份。证书作用:1.身份验证:确认为合法服务器。2.加密密钥分发:通过非对称加密交换对称密钥。解析:HTTPS通过证书解决信任和加密问题,但需证书机构(CA)背书。七、数据库(2题,每题10分,共20分)1.题目:解释SQL中的`GROUPBY`和`HAVING`的区别。答案:-`GROUPBY`:对数据进行分组,常用于聚合函数(`SUM()`、`C

温馨提示

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

评论

0/150

提交评论