华为技术工程师面试要点与答案详解_第1页
华为技术工程师面试要点与答案详解_第2页
华为技术工程师面试要点与答案详解_第3页
华为技术工程师面试要点与答案详解_第4页
华为技术工程师面试要点与答案详解_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

2026年华为技术工程师面试要点与答案详解一、编程基础(5题,每题10分,共50分)1.题目:请实现一个函数,输入一个非负整数`n`,返回`n`的二进制表示中`1`的个数。要求不使用内置函数,时间复杂度不超过O(logn)。答案:cppintcountOnes(unsignedintn){intcount=0;while(n){count+=n&1;n>>=1;}returncount;}解析:通过位运算`n&1`获取最低位是否为`1`,然后右移一位继续统计。时间复杂度为O(logn),因为每次操作相当于将`n`缩小一半。2.题目:给定一个字符串`s`,请判断其是否为回文串。可以忽略空格和大小写。答案:cppboolisPalindrome(conststring&s){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;}解析:双指针法,跳过非字母数字字符并忽略大小写,比较对应位置的字符是否相同。3.题目:请实现快速排序算法,要求原地排序,不使用额外空间。答案:cppvoidquickSort(intarr,intleft,intright){if(left>=right)return;intpivot=arr[left+(right-left)/2];inti=left,j=right;while(i<=j){while(arr[i]<pivot)i++;while(arr[j]>pivot)j--;if(i<=j)swap(arr[i++],arr[j--]);}quickSort(arr,left,j);quickSort(arr,i,right);}解析:选择中位数作为枢轴,分区并递归排序左右子数组。原地排序通过交换元素实现。4.题目:给定一个链表,删除链表的倒数第`n`个节点,并返回头节点。答案:cppListNoderemoveNthFromEnd(ListNodehead,intn){ListNodedummy(0,head);ListNodefast=&dummy;ListNodeslow=&dummy;for(inti=0;i<n+1;i++){fast=fast->next;}while(fast){fast=fast->next;slow=slow->next;}slow->next=slow->next->next;returndummy.next;}解析:双指针法,快指针先走`n+1`步,然后快慢指针同时移动,删除慢指针的下一个节点。5.题目:请编写一个函数,检查一个数是否为完全平方数。答案:cppboolisPerfectSquare(intnum){longleft=1,right=num;while(left<=right){longmid=left+(right-left)/2;longsquare=midmid;if(square==num)returntrue;if(square<num)left=mid+1;elseright=mid-1;}returnfalse;}解析:二分查找法,检查中间数的平方是否等于目标数。时间复杂度为O(logn)。二、系统设计(3题,每题20分,共60分)1.题目:设计一个简单的URL缓存系统,要求支持以下功能:-`addURL(url,timestamp)`:添加URL及其访问时间。-`getShortURL(url)`:返回URL对应的短ID(假设唯一)。-`getURL(shortID)`:通过短ID获取原始URL。答案:cppinclude<unordered_map>include<string>include<random>classURLCache{private:std::unordered_map<std::string,std::string>urlMap;std::unordered_map<std::string,std::string>idMap;std::stringgenerateID(){std::stringchars="0123456789abcdef";std::stringid(6,'');std::mt19937gen(std::random_device{}());for(char&c:id)c=chars[gen()%16];returnid;}public:voidaddURL(conststd::string&url,conststd::string×tamp){std::stringid;while(idMap.count(id)||urlMap.count(id)){id=generateID();}urlMap[url]=timestamp;idMap[id]=url;}std::stringgetShortURL(conststd::string&url){returnurlMap.count(url)?idMap[generateID()]:"";}std::stringgetURL(conststd::string&shortID){returnidMap.count(shortID)?idMap[shortID]:"";}};解析:使用哈希表存储URL与短ID的映射,生成短ID时确保唯一性。时间复杂度为O(1)。2.题目:设计一个分布式限流系统,要求支持以下功能:-`grantToken()`:获取一个令牌。-`revokeToken()`:释放一个令牌。-`isLimited()`:判断是否超过限制(如每秒不超过100个请求)。答案:cppinclude<unordered_map>include<mutex>include<condition_variable>classRateLimiter{private:intcapacity;inttokens;std::mutexmtx;std::condition_variablecv;std::chrono::steady_clock::time_pointlastRefillTime;public:RateLimiter(intcapacity):capacity(capacity),tokens(capacity),lastRefillTime(std::chrono::steady_clock::now()){}voidgrantToken(){std::unique_lock<std::mutex>lock(mtx);refillTokens();if(tokens>0)tokens--;elsecv.wait(lock);}voidrevokeToken(){std::unique_lock<std::mutex>lock(mtx);if(tokens<capacity)tokens++;}boolisLimited(){std::unique_lock<std::mutex>lock(mtx);refillTokens();returntokens==0;}private:voidrefillTokens(){autonow=std::chrono::steady_clock::now();longelapsed=std::chrono::duration_cast<std::chrono::seconds>(now-lastRefillTime).count();intnewTokens=static_cast<int>(elapsed100.0/capacity);if(newTokens>0){tokens=std::min(capacity,tokens+newTokens);lastRefillTime=now;}}};解析:使用令牌桶算法,每秒补充一定数量的令牌。通过互斥锁和条件变量实现同步。3.题目:设计一个分布式消息队列,要求支持以下功能:-`publish(message)`:发布消息。-`subscribe(topic)`:订阅主题。-`consume(topic)`:消费主题的消息。答案:cppinclude<unordered_map>include<list>include<vector>include<mutex>classMessageQueue{private:std::unordered_map<std::string,std::list<std::string>>topics;std::unordered_map<std::string,std::vector<std::string>>subscribers;std::mutexmtx;public:voidpublish(conststd::string&topic,conststd::string&message){std::lock_guard<std::mutex>lock(mtx);if(topics.count(topic)){topics[topic].push_back(message);for(constauto&sub:subscribers[topic]){//异步通知消费端(简化实现)//实际场景需使用异步队列或WebSocket等机制}}}voidsubscribe(conststd::string&topic,conststd::string&subscriber){std::lock_guard<std::mutex>lock(mtx);subscribers[topic].push_back(subscriber);}voidconsume(conststd::string&topic,conststd::string&subscriber){std::lock_guard<std::mutex>lock(mtx);if(topics.count(topic)){for(constauto&msg:topics[topic]){//推送消息给订阅者}}}};解析:使用哈希表存储主题与消息的映射,以及订阅者列表。通过互斥锁保证线程安全。三、数据库与存储(3题,每题20分,共60分)1.题目:设计一个数据库表结构,用于存储用户订单信息,要求:-支持高效查询某个用户的订单数量。-支持按订单金额排序。答案:sqlCREATETABLEorders(idINTAUTO_INCREMENTPRIMARYKEY,user_idINTNOTNULL,amountDECIMAL(10,2)NOTNULL,order_timeTIMESTAMPDEFAULTCURRENT_TIMESTAMP,INDEXidx_user_id(user_id),INDEXidx_amount(amount));解析:添加`user_id`和`amount`的索引,分别支持按用户和金额查询。主键自增,时间戳默认当前时间。2.题目:解释数据库中的“事务”和“锁”的作用,并举例说明乐观锁和悲观锁的区别。答案:事务:保证数据库操作的原子性、一致性、隔离性和持久性(ACID)。例如,转账操作必须确保资金同时扣款和收款。锁:-乐观锁:假设并发冲突很少,通过版本号或时间戳在更新时检查版本是否一致。-例子:用户更新购物车时,检查商品库存版本号是否未变化。-悲观锁:假设并发冲突频繁,直接锁定资源直到事务完成。-例子:电商秒杀时,使用`SELECTFORUPDATE`锁定商品行。区别:乐观锁适用于低冲突场景,悲观锁适用于高冲突场景,但可能降低并发性能。3.题目:设计一个分布式数据库缓存方案,要求支持高可用和热数据自动刷新。答案:1.架构:使用Redis+MySQL,Redis作为缓存层,MySQL作为数据层。2.高可用:-Redis使用哨兵(Sentinel)或集群模式。-MySQL使用主从复制或多主集群。3.热数据自动刷新:-通过Redis持久化(RDB/AOF)。-使用消息队列(如Kafka)发布数据变更事件,触发缓存更新。解析:Redis高性能缓存,MySQL永久存储,通过分布式方案保证可用性,消息队列实现数据同步。四、网络与安全(3题,每题20分,共60分)1.题目:解释TCP的三次握手和四次挥手过程,并说明为什么TCP连接需要“TIME_WAIT”状态。答案:三次握手:1.客户端发送SYN包,等待服务器确认。2.服务器回复SYN-ACK包。3.客户端发送ACK包,连接建立。四次挥手:1.客户端发送FIN包,进入TIME_WAIT状态。2.服务器回复ACK包。3.服务器发送FIN包,进入TIME_WAIT状态。4.客户端回复ACK包,连接关闭。TIME_WAIT:-确保最后一个ACK包被对方收到。-处理网络延迟或丢包情况。解析:三次握手建立连接,四次挥手关闭连接,TIME_WAIT保证连接可靠。2.题目:设计一个HTTPS证书认证流程,要求支持证书颁发和吊销。答案:1.证书颁发:-客户端生成密钥对,将公钥提交给CA(如Let'sEncrypt)。-CA验证身份后签发证书(包含公钥、有效期、域名等)。-客户端将证书嵌入Web服务器。2.

温馨提示

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

评论

0/150

提交评论