腾讯WXG日常实习一面(63min)

不得不说腾讯的面试质量是真的高,这次面的部门是WXG微信支付,难度爆炸。

1、EPOLL的水平模式和边沿模式有何区别?

因为自我介绍时,项目中用了EPOLL,所以问了这个,我按照常规思路答了。

2、ET和LT模式各自应用场景是什么?为什么有了高效的ET还需要LT?

这个问题没准备过,被问傻了,后来查了下:

  • LT的编程更符合用户直觉,业务层逻辑更简单,不易出错,但效率较低;
  • ET的编程可以做到更加简洁,某些场景下更加高效,但另一方面容易遗漏事件,容易产生bug;
  • 对于nginx这种高性能服务器,ET模式是很好的,Redis使用的是LT,避免使用的过程中出现bug;
  • 当并发量比较小时,比较推荐LT,因为LT模式下应用的读写逻辑比较简单,不容易遗漏事件,代码不易出错好维护,而且性能损失不大。当并发量非常大时,推荐使用ET模式,可以有效提升EPOLL效率。

3、string是如何存储数据的,具体过程?为什么会扩容2倍或1.5倍?

  • 以前的编译器是用写时复制(COW)技术,每当字符串发生复制构造或赋值时进行浅拷贝,只复制指针并增加一个引用计数,只有对其中一个字符串进行修改时才会执行真正的复制。既然用到了引用计数,那么就要考虑在多线程环境下的线程安全问题,而且string会把operator[]at()都认定为修改“语义”,即使我们只是访问字符串也会触发COW,这就导致stringCOW实现存在诸多弊端;
  • 现在编译器大多采用SSO(Small String Optimization)短字符串优化,当字符串长度小于15字节时直接存放在栈中,大于15字节时,栈中存放指针,指针指向堆中的完整字符串。这样的好处是,当字符串较短时,直接将其数据存在栈中,而不用去堆中动态申请空间,避免了申请堆空间的开销;
  • g++环境下,string的扩容机制跟vector一样是两倍扩容,最初分配的capacity是15字节;
  • 如果扩容倍率太低,继续插入字符的话会出现频繁扩容的现象,效率降低;如果倍率太高,又会造成空间浪费,所以我想2倍或1.5倍是一个折中的考虑,兼顾了效率与空间利用率;

4、算法题: 141. 环形链表

只让我说思路,我说用快慢指针,详细说了思路。又问我有没有别的方法,我想了半天没想出来,面试官说抛开时间复杂度和空间复杂度,你再想想,我直接说哈希表,哈希表每个元素存指针的val和next指针,这样每个元素都是唯一的,只要出现重复元素就说明有环。然后在让我想想空间复杂度的方法,提示了可以做标记,但我短时间没想出来,就给我继续出了两道题,让我边做题边想,最后再问我。

5、算法题: 234. 回文链表

直接给我这道题和下一道题,让我预估需要多少时间,我看了看说大概25分钟,面试官说给我30分钟,他先离开一会儿,到时间了再回来看我。离开前问了我第这个题的思路,我说用栈,把链表遍历入栈,再遍历一遍链表同时与栈顶元素一一比较,全部相同则为回文链表。面试官说空间复杂度太高了,能不能实现的空间复杂度,这题其实我不久前做过,以为用栈已经是很不错的方法了,结果还差得远呢。

6、算法题: 442. 数组中重复的数据

还好这个题也做过,我直接就想到空间复杂度的做法了,可惜最后没调出来,忘了取绝对值,不过面试官好像不怎么在乎,他更在意你的思路是否正确。
面呗平台的面试,算法题都要写一个完整的cpp文件,需要自己处理输入输出,自己写ListNode结构体,自己构造链表。
现在想起来,在遍历链表过程中可以把链表的val修改成范围之外的val,这样第二次遍历到相同节点时,就能判环了。

7、面试官回来了

继续问我第六题的优化,问我是否有必要把整个链表存入栈中,提示了我一下,我突然想起来回文链表前后段是对称的,那么只需要让一半的链表入栈即可,大喜!然而面试官说还不够,你怎么确定链表的一半是多长?我答先把链表遍历一遍就知道了,面试官提示说不遍历整个链表也可以知道长度,又提示了下我第4题提到的判环方法,我突然又想到了快慢指针,快指针走到链表尾的时候,慢指针刚好指向链表中间,大喜!然而面试官说还是不够,接着他说了最终解法:快慢指针向前走,慢指针一边走一边反转链表,快指针走完就分成了两个链表,直接比较两个链表即可!我直呼妙啊妙啊!

8、反问

您的部门属于后台开发,是不是对网络编程这块要求很高,那我应该如何提高自己网络编程的能力呢?
面试官说其实他们还是更注重基础,基础一定要扎实,要有钻研精神,遇到问题要多想为什么,比如你知道ET和LT两种模式有区别,但你却没有继续去了解他们为什么有区别,他们的存在有何必要,适用于哪些应用场景等。其实网络编程这块你知道少一些也行,最最重要的是基础。

总结

面试体验非常好,感觉自己都学到不少东西,真的是通过面试成长了。
不知道面试官中途是真的走了还是在旁边看着,但写题的时候我放松多了,报错的时候也各种cout输出调试,想尽一切办法debug,以前面试官盯着我的时候我老不好意思用cout调试程序哈哈。

#实习##面经##腾讯##C++工程师#
我的面经汇总 文章被收录于专栏

主要整理了自己2022届校招的面经。

全部评论
这问的太难了...
1
送花
回复
分享
发布于 2021-07-31 17:12
我也喜欢用cout调试
3
送花
回复
分享
发布于 2021-07-21 21:01
滴滴
校招火热招聘中
官网直投
点赞
送花
回复
分享
发布于 2021-07-20 16:14
网络库如果有buffer类,lt也是可以的,因为可以一次性读完数据了,利用readv这个函数把,效率也不会低多少的。
点赞
送花
回复
分享
发布于 2021-07-22 00:46
我们是不是一个面试官
点赞
送花
回复
分享
发布于 2021-07-22 16:32
过了吗
点赞
送花
回复
分享
发布于 2021-07-26 21:57
这也太难了吧
点赞
送花
回复
分享
发布于 2021-07-28 16:56
楼主是本科还是研究生呀,找的是日常实习还是暑期实习呀
点赞
送花
回复
分享
发布于 2021-10-30 21:33
面试官说的基础是指哪几科知识?
点赞
送花
回复
分享
发布于 2021-12-03 14:12

相关推荐

#蚂蚁##算法##实习#三面继续问项目,没问啥其他的东西。项目中遇到的最大困难我去这个问题把我问到了,因为总体来说算是一个比较顺利的项目,没有特别大的问题。建议以后面对这种情形应该如何回答?1)小挑战也是挑战:你可以选择项目中的一个小挑战,即使它不是一个巨大的困难。描述这个问题,解释它为何重要,以及你是如何解决它的。这可以显示你对项目细节的关注和处理潜在问题的能力。2)预防措施:说明你或你的团队采取了哪些预防措施来避免大问题的发生。这展示了你的前瞻性和风险管理能力。比如,通过良好的计划和沟通,项目团队可能成功避免了潜在的技术或协作难题。3)学习和成长:谈论这个项目如何帮助你成长,特别是在没有显著困难的情况下,你如何持续寻找提升工作效率和质量的机会。这表明你有自我驱动,始终寻求改进和学习的态度。4)团队协作:如果项目进展顺利,部分原因可能是团队合作良好。你可以讨论团队如何有效协作,以及你在其中扮演的角色。这不仅显示了你的团队精神,也突出了你在维持团队和谐中的贡献。5)优化和调整:也许在项目执行过程中,你们对策略或流程进行了微调。可以讨论这些小的调整如何帮助优化结果,这反映了你对持续改进的承诺和对细节的关注。我面试中的回答确实答得有点low了,逻辑有些混乱,因为这个把我挂了我也不会意外。微笑面对结果,不断成长,就当为秋招做积累吧。下次应该这样回答:在这个项目中,尽管整体进展顺利,但我们确实面临了一些有意思的挑战,特别是在实现和验证预测概率校准的过程中。一个具体的挑战是如何准确地量化模型的不确定性,并通过概率校准提供一个可靠的预测。换句话说,如何证明我们的p-value设计是可靠的。这种设计方法是非参数的,不依赖于数据具体的分布,这使得它在应用于实际复杂数据时更为健壮。我们通过计算测试数据中一个奇异值小于或等于训练集中奇异值的比例,实质上应用了经验分布函数(ECDF),来估计这个或更极端情况出现的概率。计算得到的p-value反映了在零假设下观察到的统计量的概率。在这里,零假设是指测试数据的奇异值不提供足够的证据去反对模型在该点的预测。如果p-value很低,表示这种奇异值在训练数据中很少见,暗示着模型在这一点上的预测可能不太可靠,这为我们的模型预测提供了一个直观和科学的可信度评估。总的来说,这是一种基于统计学的方法,数据越多将越有效
点赞 评论 收藏
转发
24 192 评论
分享
牛客网
牛客企业服务