2026年互联网巨头公司技术专家面试秘籍工程师考核问题集_第1页
2026年互联网巨头公司技术专家面试秘籍工程师考核问题集_第2页
2026年互联网巨头公司技术专家面试秘籍工程师考核问题集_第3页
2026年互联网巨头公司技术专家面试秘籍工程师考核问题集_第4页
2026年互联网巨头公司技术专家面试秘籍工程师考核问题集_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

2026年互联网巨头公司技术专家面试秘籍:工程师考核问题集一、编程基础与数据结构(共5题,每题8分,总分40分)1.题目:实现一个函数,输入一个非负整数`n`,返回`n`的汉明重量(即二进制表示中`1`的个数)。要求时间复杂度为O(1)。答案:cppinthammingWeight(uint32_tn){intcount=0;while(n){count+=n&1;n>>=1;}returncount;}解析:通过位运算,每次判断最低位是否为`1`,然后右移一位,直到`n`为`0`。时间复杂度为O(1),因为32位整数最多循环32次。2.题目:给定一个字符串`s`,判断它是否是回文串。可以忽略非字母数字字符,且不区分大小写。答案:cppboolisPalindrome(strings){intleft=0,right=s.size()-1;while(left<right){while(left<right&&!isalnum(s[left]))left++;while(left<right&&!isalnum(s[right]))right--;if(tolower(s[left])!=tolower(s[right]))returnfalse;left++;right--;}returntrue;}解析:双指针法,从两端向中间遍历,忽略非字母数字字符,并统一为小写比较。时间复杂度O(n),空间复杂度O(1)。3.题目:实现快速排序算法,要求不使用递归,手动模拟递归栈。答案:cppvoidquickSort(vector<int>&nums){stack<int>stk;stk.push(0);stk.push(nums.size()-1);while(!stk.empty()){intright=stk.top();stk.pop();intleft=stk.top();stk.pop();intpivot=partition(nums,left,right);if(left<pivot-1){stk.push(left);stk.push(pivot-1);}if(pivot+1<right){stk.push(pivot+1);stk.push(right);}}}intpartition(vector<int>&nums,intleft,intright){intpivot=nums[right];inti=left-1;for(intj=left;j<right;j++){if(nums[j]<=pivot){i++;swap(nums[i],nums[j]);}}swap(nums[i+1],nums[right]);returni+1;}解析:手动使用栈模拟递归,避免递归栈溢出。时间复杂度O(nlogn),最坏O(n^2)。4.题目:设计LRU(LeastRecentlyUsed)缓存,支持`get`和`put`操作。要求空间复杂度O(1)。答案:cppclassLRUCache{public:LRUCache(intcapacity):capacity(capacity){}intget(intkey){if(cache.find(key)==cache.end())return-1;autoit=cache[key];cache.erase(key);cache[key]=cache.end();returnit->second;}voidput(intkey,intvalue){if(cache.find(key)!=cache.end()){cache[key]->second=value;cache.erase(key);cache[key]=cache.end();}else{if(cache.size()==capacity){cache.erase(cache.begin());}cache[key]=cache.end();}}private:unordered_map<int,list<pair<int,int>>::iterator>cache;intcapacity;};解析:使用`unordered_map`记录键到双向链表的迭代器,双向链表维护访问顺序。`get`时移动到链表末尾,`put`时先删除旧键,再插入新键。时间复杂度O(1)。5.题目:给定一个二叉树,判断它是否是平衡二叉树(左右子树高度差不超过1)。答案:cppboolisBalanced(TreeNoderoot){returncheckHeight(root)!=-1;}intcheckHeight(TreeNodenode){if(!node)return0;intleft=checkHeight(node->left);if(left==-1)return-1;intright=checkHeight(node->right);if(right==-1||abs(left-right)>1)return-1;returnmax(left,right)+1;}解析:后序遍历计算子树高度,若发现不平衡则提前返回`-1`。时间复杂度O(n),空间复杂度O(h),h为树高。二、算法与设计(共5题,每题10分,总分50分)1.题目:设计一个算法,找出无重复字符的最长子串长度。答案:cppintlengthOfLongestSubstring(strings){unordered_map<char,int>lastPos;intstart=0,maxLen=0;for(inti=0;i<s.size();i++){if(lastPos.find(s[i])!=lastPos.end()){start=max(start,lastPos[s[i]]+1);}lastPos[s[i]]=i;maxLen=max(maxLen,i-start+1);}returnmaxLen;}解析:滑动窗口法,记录字符上一次出现的位置,动态调整窗口。时间复杂度O(n),空间复杂度O(1)。2.题目:设计一个算法,将单词列表按字典序排列。答案:cppvoidsortWords(vector<string>&words){sort(words.begin(),words.end(),[](conststring&a,conststring&b)->bool{returna<b;});}解析:直接使用`sort`函数,自定义比较器按字典序排序。时间复杂度O(nlogn),空间复杂度O(logn)。3.题目:设计一个算法,找出数组中的第k个最大元素。答案:cppintfindKthLargest(vector<int>&nums,intk){nth_element(nums.begin(),nums.begin()+k-1,nums.end(),greater<int>());returnnums[k-1];}解析:使用`nth_element`选择第k个最大元素,时间复杂度O(n)。若需完全排序,则`sort`(O(nlogn))。4.题目:设计一个算法,合并两个有序链表,返回合并后的头节点。答案:cppListNodemergeTwoLists(ListNodel1,ListNodel2){ListNodedummy;ListNodetail=&dummy;while(l1&&l2){if(l1->val<l2->val){tail->next=l1;l1=l1->next;}else{tail->next=l2;l2=l2->next;}tail=tail->next;}tail->next=l1?l1:l2;returndummy.next;}解析:迭代合并,使用虚拟头节点简化边界处理。时间复杂度O(n),空间复杂度O(1)。5.题目:设计一个算法,实现LRU缓存的高效实现(使用双向链表+哈希表)。答案:cppclassLRUCache{public:LRUCache(intcapacity):capacity(capacity){}intget(intkey){if(cache.find(key)==cache.end())return-1;autoit=cache[key];moveToHead(it);returnit->second;}voidput(intkey,intvalue){if(cache.find(key)!=cache.end()){autoit=cache[key];it->second=value;moveToHead(it);}else{if(cache.size()==capacity){cache.erase(tail->prev);removeNode(tail->prev);}addNode(makeNode(key,value));cache[key]=head->next;}}private:structNode{intkey,value;Nodeprev;Nodenext;Node(intk,intv):key(k),value(v){}};Nodehead=newNode(0,0);Nodetail=newNode(0,0);unordered_map<int,Node>cache;intcapacity;voidaddNode(Nodenode){node->prev=head;node->next=head->next;head->next->prev=node;head->next=node;}voidremoveNode(Nodenode){node->prev->next=node->next;node->next->prev=node->prev;}voidmoveToHead(Nodenode){removeNode(node);addNode(node);}NodemakeNode(intkey,intvalue){returnnewNode(key,value);}};解析:双向链表维护访问顺序,哈希表记录键到节点的映射。`get`和`put`时调整链表,时间复杂度O(1)。三、系统设计(共3题,每题20分,总分60分)1.题目:设计一个微博系统,要求支持:-用户发布微博(限制长度140字符)-获取用户关注者的最新10条微博-支持关注/取消关注答案:架构设计:1.数据存储:-微博:使用MySQL存储,字段包括`id`(主键)、`user_id`、`content`、`timestamp`。-用户:MySQL存储,字段包括`id`、`username`、`followings`(JSON存储关注列表)。2.缓存:-Redis缓存用户关注列表,避免频繁查询MySQL。-用户最新10条微博使用Redis/ZSet按时间排序存储。3.接口设计:-`postTweet(user_id,content)`:保存微博,更新用户ZSet。-`getFeed(user_id)`:获取关注者微博,合并ZSet取最新10条。-`follow(user_id,followee_id)`:更新关注列表,触发缓存更新。解析:-微博使用关系型数据库保证事务性,关注列表用Redis提高性能。-ZSet用于按时间排序,避免全表扫描。2.题目:设计一个短链接系统,要求:-输入长链接,返回短链接-通过短链接访问时,重定向到长链接-支持自定义短链接前缀答案:架构设计:1.数据存储:-使用Redis存储`long_url->short_url`映射,支持快速查找。-短链接使用自增ID或哈希生成,如`/a1b2c3`。2.生成短链接:-使用Base62编码(a-z,A-Z,0-9)将ID压缩。3.重定向:-接收短链接,解析ID,查询Redis返回长链接。解析:-Redis保证高并发读写,Base62减少链接长度。3.题目:

温馨提示

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

评论

0/150

提交评论