0.前言git
以前写了一些具体知识点的相关文章,本次聊聊面试实战。程序员
面试是为了查漏补缺、明确学习方向和斩获offer,因此写一些本身以及好朋友们遇到过的面试题、以及我的对面试的一些见解。
题目主要来自百度、阿里、腾讯、微博、搜狗、FunPlus、高德、滴滴、快手、旷视、360、迅雷、猎豹、TME等公司。面试
因为时间缘由作到100%完整描述不太可能,可是基本上也都达意了,有必定的参考价值。算法
1.修炼心法数据库
不打无准备之仗编程
知己知彼百战不殆,面试以前须要在拉勾、BOSS直聘上大体了解一下招聘岗位的工做描述,不排除一些公司虚张声势写些个根本用不着的玩意,因此若是以为岗位对口却匹配度低,也没必要紧张试试再说。
内推是了解岗位要求的重要渠道,不过从经验看若是不是内推人本组的招聘岗位,很难作到深刻细致的了解,总起来讲这样的内推和在线投递差异并不太大,不要觉得内推就稳了,不然笔者内推奖金早拿到手软了。设计模式
另外相同岗位不一样级别考察的侧重点也有很大区别,所以要根据意向岗位级别在深度和广度上进行差别化准备。数组
面试官什么路子缓存
一百场面试就有一百种侧重点,但并不能都算得上高质量的面试,知乎上有关于高质量面试的话题,感兴趣能够看看。安全
做为主导者的面试官,我的认为最重要的原则是:明确在招岗位的职责内容,并以此为出发点对候选人进行考察,通常来讲候选人过往经历和在招岗位很类似的状况比较少,在此状况下就要从候选人的基础是否扎实、学习能力如何等方面来衡量候选人快速适应新岗位内容的能力。
举个例子:"并不必定要把1TB的硬盘装满才能证实这个硬盘是1TB的"
所以不少时候面试就像是一场证实500GB硬盘具有1TB空间的过程,至于测试手段是否科学就是面试官须要拿捏的了,若是面试官都不清楚本身问这个问题到底是为了考察什么,那么这就是一场低质量的面试,因此对于候选人来讲成败与否都不用在乎,毕竟这种糊涂面试官若是之后做为同事也是件很糟糕的事情。
作个合格的面试者
候选人没法左右面试官的问题,可是对于非大神面试者仍是要作到几点,来提升面试成功率,包括但不限于:
珍惜机会切忌裸面
毫无准备地去面试既浪费本身的时间也浪费面试官的时间,任何事情都有机会成本,重要的是如今大厂都有本身的人才库体系,若是一年半载后再投,上次裸面的评价都依然还在,新的面试官对候选人的印象会大打折扣,甚至不给面试机会,因此要珍惜面试机会,裸面的面试者并很多见,问几个问题就GameOver了,场面也十分尴尬。
理清思路清晰表达
在面试官表述了问题以后,就算问题在射程范围内也不要急于回答,先理清楚条件,若有疑问当即求证,肯定问题全部条件再作解答。在笔者做为面试官时比较看重这一点,由于这种性格在工做中是很是难得的,不少时候你会遇到不少模糊需求,若是不反复肯定就按照你觉得的开干,只能是缘木求鱼,最终delay掉需求。
拓展思惟勇敢做答
对于大部分面试者来讲,遇到没见过的题目也没必要慌张要冷静分析当前问题中的难点,进而结合本身的实际经验和知识储备来提出你的分析和解决方案,纵然短期内很难提出最优方案,或许能够很接近答案了,可是也不要胡说,不然只能让人以为你胆大心更大,具有删库跑路的潜力。
相信本身信心满满
时常出现面试者去二三线厂面试,最后给的评价很低,彻底与其本人技术实力不匹配,以后短期内反手拿了BAT的offer,因此任什么时候候都不要妄自菲薄,要无条件相信本身。我对此深有体会,笔者本硕都非CS专业且有必定跨度,遥想当年校招隔壁实验室一块儿打球的CS硕们收割大厂offer,我这边就算小公司也会被鄙视一通,因此不管现境如何,坚决信念、找准方向、持续发力、总会有所斩获。
2.实战题目
因为笔者以及好朋友们大都是Linux C/C++/Python/Go技术栈,因此实战题目也是围绕这个技术栈展开的,其余语言栈的大神能够选择性阅读无语言差别的共性问题,好比MySQL、Redis、Linux系统等。
题目分类
Linux C/C++技术栈的题目通常包括但不限于如下几大类:
编程语言
数据结构和算法
数据库存储
Linux系统
开源组件
工程设计
题目汇总
按照上面分类来概括一些大厂的问题,更能看到各个分类下的热门问题,从而更好地把握面试方向。
编程语言
阐述如何设计一个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++的设计模式,重点介绍下单例模式、工程模式等。
数据结构和算法
求二叉树节点和为N的全部路径。
实现二叉树的镜像。
实现两棵二叉树相加生成一棵新的二叉树。
实现单链表的递归逆置和非递归逆置。
二分查找变种问题。
二叉树的后序非递归遍历。
两个无序整型数组交换元素使得两数组和差距最小。
给定整型数组和目标数输出数组全部两数之和为目标数的组合。
找到带权重二叉树中从根到叶子的最大和路径。
最长公共子序列LCS问题。
二叉树中找到指定两个节点最近公共祖先。
实现堆排序求Top10数据。
实现最小栈。
简述并尝试设计一个布隆过滤器。
外排序的基本实现过程。
常见排序算法的性能对比。
快速排序的非递归实现
注:关于数据结构和算法的网站和书籍很是多,而且这个分类也是面试中变幻最大的,这里就不展开了。
对于数据结构和算法能力的切实提升,能够刷LeetCode、《算法导论》、《编程之法》、《编程珠玑》、《程序员面试金典》(注意不是宝典)、《程序员代码面试指南》等书籍,不少公众号或者书籍的做用是对知识点进行梳理概括总结,没有捷径,只有本身动手多练多写才能真正成为本身的硬实力。
笔者认为虽然数据结构和算法的题目比较繁杂,可是掌握常见数据结构(数组、链表、栈、队列、树等)的基本特性和实现方法,再结合二分、递归、回溯、贪心、动态规划等算法思想,不少问题均可以回答得比较接近正确答案,数据结构作骨架、算法是灵魂,务必多练多写找到感受。
坚持天天刷leetcode是个好办法,可是对于在职人员来讲996已经快被搞死了,LeetCode每日一题确实有些困难,何况刷LeetCode的重点在于一题N解,多个角度多种方法解题,不过仍是那句话:"种一棵树的最好时间是十年前,然后是如今"。
数据库存储
谈谈对于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,须要考虑什么。
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是如何解决的?
谈谈对服务治理和服务发现的理解。
微服务接触过吗?谈谈对微服务的理解。
服务异步化编程了解过吗?
开源组件
经常使用的MQ有哪些以及各自的对比和场景
Kafka的基本原理和实现要点
libevent/libuv的基本原理和使用
Boost.Asio的原理和使用
微信协程库libco原理和使用
DPDK的基本原理和用户态协议栈的概念
Redis和Memcached对比
RPC框架对比:brpc/grpc/thrift
STL源码的理解和阅读分析
Nginx的架构、原理、使用
注:开源组件的问题通常都比较宽泛,所以没有列举太多具体问题。
开源组件的准备重在基本原理和架构的理解,面试官不但愿候选人对开源组件的使用是彻底的拿来主义和黑盒子式API调用,其次是从开源组件中得到解决问题的思想和套路。
由于平常工做场景有不少共性问题,能够借鉴开源组件的经验进行迁移解决,都是要站在巨人的肩膀上的,牛顿都站了,你何须要闭门造车呢?
工程设计
信息流推荐中会生成大量点击率文章,设计一个程序实现即时排序,返回热门文章。
词库每一个词都有根据点击率来计算的热度,实现一个系统,支持前缀匹配而且返回Top10的热词。
设计一个支持千万级文章类似度去重的程序,来实现抄袭、洗稿文章的识别,时间ms级,准确率不低于95%。
小内存机器有两个文件A和B,分别存放5亿条均长64字节的url,试着找到A和B中全部重复的url。
尝试实现一个简单的音乐推荐系统,能够不涉及具体算法,主要说明工程部分便可。
设计一个黑词服务实现黄反、指令词、敏感词等过滤功能,耗时ms级。
工程设计题目通常会是面试官平常遇到的典型问题,类型不少,可是系统设计类问题常常和海量数据问题、堆排序等一块儿出现。
对于此类问题,重要的是明确功能点、找准解题方向、拆解子问题、分步骤合并、各个击破、先实现再提优化方案,以此原则来解决工程设计问题,基本上就很接近答案了。
3.小结和感慨
题目不少而且没有给出解答,除了工程设计题,其余题目在网上均可以找到解答,可是本号会在后续文章中对上述问题各个击破,创建完整分类的体系,敬请期待。
2018下半年以及整个2019一直被认为是寒冬时期,也总能听到裁人或者公司倒闭的一些消息,有校招生比offer也有刚毕业的应届生被裁,有套现离场的也有昨天还在熬夜加班优化代码,第二天被裁的,还有甚嚣尘上的35岁失业问题,林林总总。
不管如何做为求职者和在职者都要坦然面对,市场波动在所不免,咱们能作的只有:拥抱变化 时刻准备着。