炸裂!前浪老狗工作这5年遇到的面试题们,建议老铁们收藏&研读
扫描二维码
随时随地手机看文章
摄于:19年9月广州飞北京
0.先唠唠嗑
Paxos文章跳票了。
最近总是鸽,写作也鸽,跑步也鸽,更别提摆地摊了,倒是最近标题党的感觉越来越重了,主要是怕各位老铁错过这篇干货...
所以就得反思一下为什么最近总鸽?说到底时间都被我浪费了。
根据以往的经验,工作时找个隔音非常好的耳机,然后把手机扔得远一点,睡前也把手机扔远点,是可以提高时间利用效率的。
想起几年前准备考研的时候,就用只能打电话发短信的手机,充一次电用好几天,自己对时间的把控力也就好很多,现在看还是各种坏习惯太多了,时间也都给浪费掉了。
但是不要走极端,闭门造成更可怕,所以合理利用时间是很重要的,好像闻到了鸡汤的味道。
每次长假回到老家,早上6点多就起来,然后忙很久看时间才10点,瞬间觉得时间被拉长了很多,感觉赚到了,但是一回北京就继续晚睡晚起,但是我还是十分渴望一种健康的田园式作息的。
扯了这么多,只是想当个反面教材,和盆友们共勉一下:早睡早起 远离手机 提高技能 努力赚钱。
所以今天和老铁们聊聊面试的一些问题和观点,为提高收入做点准备,题目基本上都是工作这些年自己遇到的或者身边好友遇到的,所以整理了一下。
先看一张非常有名的图片暗淡蓝点(维基百科):
暗淡蓝点是旅行者1号拍下的有史以来第一张太阳系家族照的一部分。
从距离地球40亿英里,黄道上方32°的地方,拍摄了60幅画面,最后拼接成太阳系照片。
在遥远的旅行者1号眼里,地球只是一个光点,即使在窄角镜头里,也小于1个像素,新月形的地球只有0.12个像素那么大。
很巧的是,地球正好就在靠近太阳的一道散射光线中间。
1.面试心法
1.1 不打无准备之仗
知己知彼百战不殆,面试之前需要在拉勾、BOSS直聘上大致了解一下招聘岗位的工作描述,不排除一些公司虚张声势写些个根本用不着的玩意,所以如果觉得岗位对口却匹配度低,也不必紧张试试再说。
内推是了解岗位要求的重要渠道,不过从经验看如果不是内推人本组的招聘岗位,很难做到深入细致的了解,总起来说这样的内推和在线投递差别并不太大,不要以为内推就稳了,否则笔者内推奖金早拿到手软了。
另外相同岗位不同级别考察的侧重点也有很大区别,因此要根据意向岗位级别在深度和广度上进行差异化准备。
1.2 面试官什么路子
一百场面试就有一百种侧重点,但并不能都算得上高质量的面试,知乎上有关于高质量面试的话题,感兴趣可以看看。
https://www.zhihu.com/question/60911582
作为主导者的面试官,个人认为最重要的原则是:明确在招岗位的职责内容,并以此为出发点对候选人进行考察,一般来说候选人过往经历和在招岗位很相似的情况比较少,在此情况下就要从候选人的基础是否扎实、学习能力如何等方面来衡量候选人快速适应新岗位内容的能力。
举个例子:"并不一定要把1TB的硬盘装满才能证明这个硬盘是1TB的"
因此很多时候面试就像是一场证明500GB硬盘具备1TB空间的过程,至于测试手段是否科学就是面试官需要拿捏的了。
如果面试官都不清楚自己问这个问题究竟是为了考察什么,那么这就是一场低质量的面试,所以对于候选人来说成败与否都不用在意,毕竟这种糊涂面试官如果以后作为同事也是件很糟糕的事情。
1.3 做个合格的面试者
-
珍惜机会切忌裸面
-
理清思路清晰表达
-
拓展思维勇敢作答
-
相信自己信心满满
我对此深有体会,笔者本硕都非CS专业且有一定跨度,遥想当年校招隔壁实验室一起打球的CS硕们收割大厂offer,我这边就算小公司也会被鄙视一通,所以无论现境如何, 坚定信念、找准方向、持续发力、总会有所斩获。
2.实战题目
2.1 题目分类
-
数据结构和算法 -
数据库存储 -
Linux系统 -
开源组件 -
工程设计
2.2 题目汇总
2.2.1 编程语言
-
阐述如何设计一个C++类?实现String类。 -
谈谈对C++虚函数机制的理解。 -
STL的Vector原理及迭代器失效的理解。 -
设计一个C++HashMap类。 -
使用C++实现一个堆的模板类。 -
写一个宏定义比较函数并解释宏展开过程。 -
谈谈std::move的理解和使用。 -
malloc的内存可以用delete释放吗?原因? -
简述C++11的新特性以及解决了什么问题。 -
STL的Map原理、插入和删除复杂度分析。 -
STL的Map基于红黑树实现的原因,为什么不选择哈希表? -
为什么需要虚析构?虚析构和普通析构函数的区别是什么? -
说明C++对象的内存布局模型。 -
聊聊C++临时对象和右值引用,写个例子。 -
使用C++写一个高效的多维矩阵乘法。 -
谈谈对智能指针的认识并实现一个智能指针类。 -
STL中Map的查找时[]和find区别是什么?哪个更快? -
实现memcpy函数效率尽可能高。 -
尝试实现C/C++中常用字符串库函数。 -
谈谈C++中强制类型转换的原理和使用,写个例子。 -
谈谈C++的设计模式,重点介绍下单例模式、工程模式等。
2.2.2 数据结构和算法
-
求二叉树节点和为N的所有路径。 -
实现二叉树的镜像。 -
实现两棵二叉树相加生成一棵新的二叉树。 -
实现单链表的递归逆置和非递归逆置。 -
二分查找变种问题。 -
二叉树的后序非递归遍历。 -
两个无序整型数组交换元素使得两数组和差距最小。 -
给定整型数组和目标数输出数组所有两数之和为目标数的组合。 -
找到带权重二叉树中从根到叶子的最大和路径。 -
最长公共子序列LCS问题。 -
二叉树中找到指定两个节点最近公共祖先。 -
实现堆排序求Top10数据。 -
实现最小栈。 -
简述并尝试设计一个布隆过滤器。 -
外排序的基本实现过程。 -
常见排序算法的性能对比。 -
快速排序的非递归实现
2.2.3 数据库存储
-
谈谈对于Redis的底层数据结构的理解。 -
跳表了解吗?Redis的zset实现原理以及为什么不用红黑树。 -
Redis哨兵原理以及集群版故障转移过程。 -
基于Redis实现分布式锁。 -
Redis渐进式Rehash的实现原理。 -
Redis和LevelDB的区别以及LevelDB的LSM树和WAL原理。 -
Redis主从同步的实现原理和过程、产生数据丢失的原因。 -
MyISAM和InnoDB的区别。 -
MySQL索引原理和优化。 -
Redis集群版如何实现一致性Hash算法的。 -
Redis的单线程网络框架原理和混合持久化机制。 -
类Redis数据库Pika了解吗?基本设计架构是什么? -
如何设计一个缓存系统以及缓存击穿的解决方案? -
一致性协议raft/paxos/2pc/3pc基本原理。 -
Redis的Gossip协议原理。 -
Redis4.0+版本的BIO线程原理和使用。 -
简述如何自己实现一个NoSQL,需要考虑什么。
2.2.4 Linux系统
-
LVS实现负载均衡的原理。 -
简述Linux内存管理原理以及伙伴算法和Slab算法。 -
select和epoll的对比以及epoll实现的底层原理和数据结构。 -
epoll的LT模式和ET模式下读写操作,实现一下ET模式的read/write。 -
使用C++简单实现一个生产者消费者模型。 -
Linux虚拟内存和物理内存的区别与联系 -
如何使用gdb调试多进程、多线程程序。 -
谈谈C10K和C10M问题及大致实现思路。 -
Linux地址复用和端口复用的使用。 -
谈谈Reactor和Proactor模式区别与联系。 -
尝试基于epoll实现一个高并发网络框架。 -
Nginx的基本原理以及负载均衡实现方法。 -
谈谈Linux服务器内存/cpu/磁盘/网络带宽的监控命令和问题排查。 -
谈谈CAP理论以及分布式一致性算法。 -
了解CpuCache吗,如何据此来优化代码。 -
读写锁、RCU锁、自旋锁的对比以及设计读优先/写优先的读写锁。 -
自己设计实现一个简单的读写锁。 -
谈谈grpc的使用以及brpc的对比。 -
对比协程和进线程,重点说明系统开销差异和各自优缺点。 -
谈谈对线程同步和多线程安全的理解。 -
Https的C/S交互过程、http1.0/2.0/3.0的对比。 -
多进程通信的方法和对比。 -
多线程同步的实现和线程安全。 -
实现一个基于LRU的本地缓存。 -
TCP/IP的拥塞控制原理和缺陷、BBR算法对比。 -
使用Python实现多进程和多线程以及谈谈对GIL的理解。 -
网络攻击有哪些?简述DDos、CC攻击。 -
对比内存分配malloc/tcmalloc/ptmalloc。 -
Protobuf协议的简单原理和使用。 -
Coredump的常见原因。 -
死锁的原理以及写一个死锁。 -
MapReduce的基本原理、写个简单的map和reduce的程序。 -
同步异步阻塞非阻塞IO的理解。 -
git的基本原理以及常用命令。 -
局部性hash算法simhash的原理。 -
服务端长短连接的区别、优势和场景。 -
如何避免多线程的虚假唤醒问题。 -
实现简单的线程池和连接池。 -
实现一个可以完成C10K+的TCP网络框架。 -
尝试多种方法实现一个守护进程,2 magic fork了解吗? -
惊群问题知道吗?Nginx是如何解决的? -
谈谈对服务治理和服务发现的理解。 -
微服务接触过吗?谈谈对微服务的理解。 -
服务异步化编程了解过吗?
2.2.5 开源组件
-
常用的MQ有哪些以及各自的对比和场景 -
Kafka的基本原理和实现要点 -
libevent/libuv的基本原理和使用 -
Boost.Asio的原理和使用 -
微信协程库libco原理和使用 -
DPDK的基本原理和用户态协议栈的概念 -
Redis和Memcached对比 -
RPC框架对比:brpc/grpc/thrift -
STL源码的理解和阅读分析 -
Nginx的架构、原理、使用
注:开源组件的问题一般都比较宽泛,因此没有列举太多具体问题。
2.2.6 工程设计
-
词库每个词都有根据点击率来计算的热度,实现一个系统,支持前缀匹配并且返回Top10的热词。 -
简述如何设计一个支持千万级文章相似度去重的程序,来实现抄袭、洗稿文章的识别,时间ms级,准确率不低于90%。 -
小内存机器有两个文件A和B,分别存放5亿条均长64字节的url,试着找到A和B中所有重复的url。 -
尝试实现一个简单的音乐推荐系统,可以不涉及具体算法,主要说明工程部分即可。 -
设计一个黑词服务实现黄反、指令词、敏感词等过滤功能,耗时ms级。 -
设计一个类似于微信运动的功能,包含占领封面/七日排行榜等。
工程设计题目一般会是面试官日常遇到的典型问题,类型很多,但是系统设计类问题经常和海量数据问题、堆排序等一起出现。
对于此类问题,重要的是明确功能点、找准解题方向、拆解子问题、分步骤合并、各个击破、先实现再提优化方案,以此原则来解决工程设计问题,基本上就很接近答案了。
这类题目其实还是很考验架构能力的,所以平时要多思考产品模式和技术点,算是个好习惯吧。
3.小结和感慨
特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:
长按订阅更多精彩▼
如有收获,点个在看,诚挚感谢
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!