版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026年腾讯技术面试常见问题及解析一、编程基础(5题,每题8分,共40分)1.题目:请实现一个函数,输入一个正整数`n`,返回`n`的二进制表示中`1`的个数。例如:`n=5`(二进制`101`),返回`2`。答案:cppintcountBits(intn){intcount=0;while(n){count+=n&1;n>>=1;}returncount;}解析:该方法利用位运算。每次将`n`与`1`进行按位与操作,如果最低位是`1`,则计数器加一;然后右移一位,直到`n`为零。时间复杂度为O(logn),空间复杂度为O(1)。2.题目:给定两个字符串`s1`和`s2`,请判断`s2`是否可以通过对`s1`进行若干次删除操作得到。例如:`s1="abcde"`,`s2="ace"`,返回`true`。答案:cppboolisSubsequence(strings1,strings2){inti=0,j=0;while(i<s1.size()&&j<s2.size()){if(s1[i]==s2[j]){j++;}i++;}returnj==s2.size();}解析:双指针方法。`i`遍历`s1`,`j`遍历`s2`。如果`s1[i]==s2[j]`,则`j`移动;无论如何`i`都移动。最后如果`j`到达`s2`的末尾,说明`s2`是`s1`的子序列。3.题目:请实现一个函数,输入一个链表,返回其反转后的链表。假设链表节点定义如下:cppstructListNode{intval;ListNodenext;ListNode(intx):val(x),next(nullptr){}};答案:cppListNodereverseList(ListNodehead){ListNodeprev=nullptr;ListNodecurr=head;while(curr){ListNodenextTemp=curr->next;curr->next=prev;prev=curr;curr=nextTemp;}returnprev;}解析:迭代法反转链表。使用三个指针:`prev`(前驱)、`curr`(当前)、`nextTemp`(临时保存下一个节点)。依次将`curr->next`指向`prev`,然后移动指针。4.题目:给定一个数组`nums`,请实现`removeDuplicates`函数,原地删除重复元素,返回新数组的长度。例如:`nums=[1,1,2]`,返回`2`,数组前两个元素应为`[1,2]`。答案:cppintremoveDuplicates(vector<int>&nums){if(nums.empty())return0;intslow=0;for(intfast=1;fast<nums.size();fast++){if(nums[fast]!=nums[slow]){slow++;nums[slow]=nums[fast];}}returnslow+1;}解析:双指针法。`slow`指向当前不重复元素的末尾,`fast`遍历数组。如果`nums[fast]`不等于`nums[slow]`,则将`nums[fast]`复制到`nums[slow+1]`,然后`slow`移动一位。时间复杂度O(n),空间复杂度O(1)。5.题目:请实现一个函数,输入一个非负整数`n`,返回`n`的阶乘。例如:`n=5`,返回`120`。答案:cpplonglongfactorial(intn){if(n==0)return1;longlongres=1;for(inti=1;i<=n;i++){res=i;}returnres;}解析:直接循环乘积。注意使用`longlong`避免大数溢出。时间复杂度O(n),空间复杂度O(1)。二、算法设计(4题,每题10分,共40分)1.题目:设计一个LRU(LeastRecentlyUsed)缓存,支持`get`和`put`操作。`get(key)`返回键对应的值,如果不存在返回`-1`;`put(key,value)`插入或更新键值对,如果缓存已满则删除最久未使用的项。假设缓存容量为`capacity`。答案:cppclassLRUCache{private:unordered_map<int,int>cache;list<int>lruList;intcapacity;voidmoveToHead(intkey){autoit=cache.find(key);if(it!=cache.end()){lruList.erase(it->second);lruList.push_front(key);it->second=lruList.begin();}}public:LRUCache(intcapacity_):capacity(capacity_){}intget(intkey){if(cache.find(key)==cache.end())return-1;moveToHead(key);returncache[key];}voidput(intkey,intvalue){if(cache.find(key)!=cache.end()){cache[key]=value;moveToHead(key);}else{if(cache.size()==capacity){inttail=lruList.back();lruList.pop_back();cache.erase(tail);}lruList.push_front(key);cache[key]=value;}}};解析:使用`unordered_map`存储键值对(O(1)时间复杂度),使用`list`维护最近使用顺序。`get`操作将键移动到头部,`put`操作如果键已存在则更新值并移动到头部;如果缓存已满,则删除链表尾部(最久未使用)的键并从`unordered_map`中删除。时间复杂度均为O(1)。2.题目:给定一个包含`n`个点的有向图,点编号从`0`到`n-1`。请判断该图是否存在环。答案:cppboolhasCycle(intn,vector<vector<int>>&edges){vector<int>visited(n,0);//0:unvisited,1:visiting,2:visitedfor(inti=0;i<n;i++){if(visited[i]==0){if(dfs(i,visited,edges))returntrue;}}returnfalse;}booldfs(intnode,vector<int>&visited,vector<vector<int>>&edges){if(visited[node]==1)returntrue;if(visited[node]==2)returnfalse;visited[node]=1;for(intneighbor:edges[node]){if(dfs(neighbor,visited,edges))returntrue;}visited[node]=2;returnfalse;}解析:深度优先搜索(DFS)检测环。使用三个状态:未访问(0)、正在访问(1)、已访问(2)。遍历每个节点,如果该节点状态为`0`,则进行DFS。如果在DFS过程中遇到状态为`1`的节点,说明存在环。时间复杂度O(V+E),空间复杂度O(V)。3.题目:给定一个`mxn`的矩阵,每一步可以向上、下、左、右移动一格。请计算从左上角`(0,0)`到右下角`(m-1,n-1)`的最短路径长度。如果无法到达,返回`-1`。答案:cppintshortestPath(vector<vector<int>>&grid){if(grid.empty()||grid[0].empty())return-1;intm=grid.size(),n=grid[0].size();vector<vector<int>>dist(m,vector<int>(n,INT32_MAX));dist[0][0]=0;queue<pair<int,int>>q;q.push({0,0});intdirections[4][2]={{0,1},{1,0},{0,-1},{-1,0}};while(!q.empty()){auto[x,y]=q.front();q.pop();for(auto&dir:directions){intnx=x+dir[0],ny=y+dir[1];if(nx>=0&&nx<m&&ny>=0&&ny<n&&grid[nx][ny]==1){if(dist[nx][ny]>dist[x][y]+1){dist[nx][ny]=dist[x][y]+1;q.push({nx,ny});}}}}returndist[m-1][n-1]==INT32_MAX?-1:dist[m-1][n-1];}解析:广度优先搜索(BFS)求最短路径。初始化距离矩阵`dist`为无穷大,起点为`0`。使用队列进行BFS,每次移动到相邻的格子,更新距离。如果终点可达,返回距离;否则返回`-1`。时间复杂度O(mn),空间复杂度O(mn)。4.题目:给定一个无重复元素的数组`nums`,返回所有可能的子集(幂集)。例如:`nums=[1,2,3]`,返回`[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]`。答案:cppvector<vector<int>>subsets(vector<int>&nums){vector<vector<int>>res;vector<int>path;sort(nums.begin(),nums.end());function<void(int)>dfs=[&](intstart){res.emplace_back(path);for(inti=start;i<nums.size();i++){path.push_back(nums[i]);dfs(i+1);path.pop_back();}};dfs(0);returnres;}解析:回溯算法。排序后避免重复子集。从每个位置开始递归,选择当前元素并继续递归,然后撤销选择。时间复杂度O(2^n),空间复杂度O(n)。三、系统设计(1题,20分)1.题目:设计一个高并发的短链接系统。用户输入长链接,系统返回短链接,点击短链接后重定向到长链接。要求:1.短链接长度尽可能短(如`tinyurl`)。2.支持高并发访问。3.能够统计短链接的点击次数。答案:系统架构:1.短链接生成:使用Base62编码(`a-z`、`A-Z`、`0-9`,共62个字符)将ID转换为短链接。例如:ID`1`转换为`a`,`2`转换为`b`,`62`转换为`1z`。2.存储:使用Redis存储短链接与长链接的映射,并使用`Hash`结构存储点击次数。Redis的`EXPIRE`功能用于自动清理过期的短链接。3.高并发处理:-使用Nginx反向代理,将请求分摊到多个后端服务。-后端服务使用无状态设计,通过Redis实现共享状态。4.统计功能:每次重定向时,在Redis中增加点击次数。伪代码:cpp//生成短链接stringgenerateShortLink(longid){stringbase="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";stringres="";while(id>0){res=base[id%62]+res;id/=62;}returnres;}//存储长链接及点击次数voidstoreLink(stringshortLink,stringlongLink){redis.hset(shortLink,"long",longLink);redis.hset(shortLink,"count","0");redis.expire(shortLink,606024);//24小时过期}//重定向voidredirect(stringshortLink){stringlongLink=redis.hget(shortLink,"long");longcount=stol(redis.hget(shortLink,"count"));redis.hset(shortLink,"count",to_string(count+1));returnlongLink;}解析:-短链接生成:Base62编码可以生成较短的链接,且字符无歧义。-高并发:Nginx分摊请求,Redis高性能读写支持共享状态。-统计功能:通过Redis`Hash`存储`count`字段,每次重定向时更新。-扩展性:可水平扩展后端服务,Redis集群提高存储性能。四、数据库(1题,10分)1.题目:设计一个简单的社交系统数据库表结构。要求:1.用户表(`users`):包含`id`(主键)、`username`、`email`、`注册时间`。2.关注表(`follows`):记录用户关注关系,包含`follower_id`(关注者)、`followee_id`(被关注者)。3.朋友圈表(`posts`):包含`id`(主键)、`user_id`(发布者)、`content`、`发布时间`。4.朋友圈评论表(`comments`):包含`id`(主键)、`post_id`(评论的帖子)、`user_id`(评论者)、`content`、`评论时间`。答案:表结构:sqlCREATETABLEusers(idBIGINTAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50)NOTNULLUNIQUE,emailVARCHAR(100)NOTNULLUNIQUE,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP);CREATETABLEfollows(follower_idBIGINTNOTNULL,followee_idBIGINTNOTNULL,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(follower_id,followee_id),FOREIGNKEY(follower_id)REFERENCESusers(id),FOREIGNKEY(followee_id)REFERENCESusers(id));CREATETABLEposts(idBIGINTAUTO_INCREMENTPRIMARYKEY,user_idBIGINTNOTNULL,contentTEXTNOTNULL,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,FOREIGNKEY(user_id)REFERENCESusers(id));CREATETABLEcomments(idBIGINTAUTO_INCREMENTPRIMARYKEY,post_idBIGINTNOTNULL,user_idBIGINTNOTNULL,contentTEXTNOTNULL,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,FOREIGNKEY(post_id)REFERENCESposts(id),FOREIGNKEY(user_id)REFERENCESusers(id));解析:-用户表:`id`为主键,`username`和`email`唯一约束避免重复。-关注表:复合主键`(follower_id,followee_id)`避免重复关注,外键关联`users`表。-朋友圈表:`user_id`关联`users`表,`created_at`记录发布时间。-朋友圈评论表:`post_id
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《工业区位》参考教案(第2课时)
- 《正切函数的定义》提升训练
- 2026年机械设计与制造工艺水平评估试题
- 2026年心理测试专业人士案例分析题集
- 2026年文学阅读理解与鉴赏模拟题目
- 2026年物流规划师智能仓储系统操作实操考试题集
- 2026年营养师考试练习题营养学基础
- 2026年金融风险管理知识试题库
- 2026年自然语言处理语义理解机器翻译实践题目
- 煤矿生产安全设备采购查验制度
- 积极思想培训
- 电杆基础施工专项方案
- 2026春译林8下单词表【Unit1-8】(可编辑版)
- 2026年《必背60题》抖音本地生活BD经理高频面试题包含详细解答
- 2025中国即饮咖啡市场趋势报告-欧睿咨询
- 电影短片拍摄实践课件
- 电商平台对用户交易纠纷处理的机制或方案(2025完整版)
- 《经典常谈》导读课件教学
- 诚信单位创建申报资料标准模板
- 食堂承包居间合同范本
- 护士心理护理操作规程
评论
0/150
提交评论