腾讯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-12-03 14:12
楼主是本科还是研究生呀,找的是日常实习还是暑期实习呀
点赞 回复 分享
发布于 2021-10-30 21:33
这也太难了吧
点赞 回复 分享
发布于 2021-07-28 16:56
过了吗
点赞 回复 分享
发布于 2021-07-26 21:57
我们是不是一个面试官
点赞 回复 分享
发布于 2021-07-22 16:32
网络库如果有buffer类,lt也是可以的,因为可以一次性读完数据了,利用readv这个函数把,效率也不会低多少的。
点赞 回复 分享
发布于 2021-07-22 00:46
点赞 回复 分享
发布于 2021-07-20 16:14

相关推荐

隔壁投了之后又被捞起来面了,以下是TimeLine6.10 投递6.12 约面6.17 一面6.26 二面6.27 三面7.1 HR面7.4 Offer一面:全程40min左右1. 自我介绍2. 开篇面试官介绍了一下这次面试的流程3. HashMap和HashTable的区别?4. 接T3,针对HashTable的问题,有没有解决方案?(ConcurrentHashMap)5. 线程和进程的区别?6. 接T5,通信方式上有什么区别?7. MySQL索引结构?8. 接T7,B树和B+树的区别是什么?9. 接T8,为什么说B+树更好做范围查询?10. MySQL事务隔离级别?11. MVCC12. 索引失效的情况都有哪些?13. Redis持久化方案?14. 缓存雪崩、缓存穿透、缓存击穿15. 讲讲TCP的三次握手和四次挥手16. 说说Linux的常用命令?17. 有没有用过Docker?说说Docker的常用命令?有自己构建过Docker镜像吗?18. 项目拷打手撕:快速排序(问了比较时使用<和<=有什么区别)反问:1. 面试官并不是Java方向的,为什么会问Java基础知识?2. 组里技术栈?(Java、Go、PHP都有,看分到哪个组)3. 后续面试流程?(2-3轮技术面+1轮hr)4. 建议?追问:1. 可能会转语言,是否接受?2. 现在在长沙吗?如果面试通过到这边来会不会有什么阻碍或者困难?面完状态10min左右状态变成业务复试二面:全程40min左右,感觉主要是手撕1. 自我介绍2. 有用过MQ对吧,那你说说怎么解决消息重传的?3. 你是怎么做消息幂等性处理的?4. 接T3,如果说Redis的key已经存入了,但是刚好消费者宕机了,怎么办?5. 建立索引的SQL语句是?6. TLS握手过程7. 手撕1:单链表有一个指针指向任意一个节点,怎么删除这个指针指向的节点,如1→2→3→4,传入2,删除2,没有头指针(回答了更改节点值,next设置为next.next,追问怎么删除最后一个节点,不会,换了道题)8. 手撕2:LeetCode199. 二叉树的右视图(写了递归,要求再写一遍非递归)闲聊:1. 什么时候能到岗?2. 是哪里人?3. 为什么会考虑来长沙这边?4. 你觉得你的优点和缺点是什么?5. 手上还有其他offer吗?反问:1. 业务面完30min左右约三面三面:1. 自我介绍2. 拷打项目3. 拷打实习4. 我现在有一个student表,我要对name简历索引,sql语句怎么写?5. 主键索引和普通索引有什么区别?6. 为什么非聚簇索引要回表?7. MySQL隔离级别?8. MySQL主从同步原理?9. binlog日志存的是什么?10. Redis缓存雪崩是个什么概念?怎么解决?11. Redis持久化方式?12. HTTP报文格式?13. HTTP和HTTPS有什么不同?14. TLS握手过程?15. 为什么是非对称加密和对称加密结合使用?能不能只使用一种?16. 面向对象三大特性17. 我现在有一个Java源代码,比如说叫xxx.java,他是如何变成一个二进制文件的能够让机器运行他的?这个中间的过程是怎么样的?18. JVM的作用是什么?19. 进程和线程的区别?20. 有没有了解过协程?跟线程的区别是什么?21. 为什么说协程为什么更轻量?22. 二进制文件加载进内存,他的分布是怎么样的?23. Linux上怎么看机器的负载?24. top命令哪些参数表示负载?25. Linux怎么看cpu的核数?26. Linux怎么查看当前目录占用了多少空间?27. 查看当前服务器建立的tcp连接,用什么命令?28. tcp滑动窗口机制是怎么样的?29. time_wait状态是什么意思?30. 为什么是四次挥手?31. 三次握手是怎么实现的?中间的ACK和SYN是怎么合并的?32. 用过docker吗?怎么做到容器间隔离的?33. 怎么构建docker镜像?34. 有了解AI吗?大模型训练过程是怎么样的?35. 有没有了解过MCP?36. 使用过什么AI工具?手撕:二叉树的层序遍历,要求null值使用*占位反问:1. 面试结果什么时候出面完状态变为HR面HR面闲聊10分钟
面试问题记录
点赞 评论 收藏
分享
评论
24
195
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务