1、一面:
1、算法题: 输出二叉树从左边看过去能看到的所有节点;(是谷歌面试题的翻版:输出最后一层子树最左边的数据)
2、给了两条 SQL 语句,让根据这两条语句建索引;
3、TCP 和 UDP 的区别;
4、算法题:给定一个翻转过的有序数组,找出翻转点的下标,如:原数组 1,2,3,5,6,7,8,翻转后的数组 5,6,7,8,1,2,3,翻转点下标是 5;
2、二面:
1、cookie 和 session 的区别;
2、session 在服务器上以怎样的形式存在;
3、怎么设置 session 和 cookie 的有效时间;
4、redis 有哪些数据类型,集合和有序集合有什么区别;
5、springMVC 和spring 是什么关系;
6、算法题:给定一个整数数组,数组中元素无重复。和一个整数 limit,求数组元素全排列,要求相邻两个数字和小于 limit;
3、三面:
1、算法题:行列都有序二维数组,找出指定元素的位置,扩展到三维数组呢;
2、给定一个场景,设计一个数据库表:写 SQL 语句,要不要对某个字段建索引,为什么;
3、怎么实现多线程并发修改某个值,要减小锁粒度呢(用 Java 提供的原子类,比如AtomicInteger),AtomicInteger 怎么实现原子修改的(核心方法是compareAndSwap 方法,俗称 CAS,源代码没有公开),CAS 方法的主要功能是什么?用伪代码描述一下
4、一面:
1、自我介绍;
2、手写代码:去除c++中的注释;
3、详细描述网络库的架构;
4、服务端编程需要用到的函数,详细解释;
5、解释time_wait状态,原因,解决方法;
6、解释MSL;
7、解释服务端哪些函数需要阻塞,如何实现非阻塞;
8、解释poll和epoll的区别,epoll的底层原理;
9、简单描述红黑树;
10、简单解释中断机制;
11、解释读写缓冲,为什么这么设计;
12、解释socket缓冲,滑动窗口协议;
13、解释backlog,为什么有这个限制;
14、线程池的简单描述;
15、了解c++11中哪些新特性;
16、左值引用和右值引用;
17、生产者消费者模型,如何实现多线程访问;
18、c++中如何实现信号量;
19、提问环节;
20、再解释论文中的一个算法吧,有加分;
5、二面:
1、自我介绍;
2、手写代码:之字形打印二叉树;
3、解释网络库;
4、解释消息队列,pub-sub系统以及RPC;
5、解释poll和epoll的区别,epoll的底层架构;
6、解释红黑树;
7、解释hash_map的底层实现;
8、解释线程池的实现;
9、聊聊你的消息如何进行序列化和反序列化,如何判断大端小端;
10、你的网络库和现在的网络库相比,有哪些没有考虑的,如何解决;
11、最近有在看哪些技术书籍;
12、mmap的原理,为什么比read,write要快;
13、fwrite会经历哪些过程;
14、解释分布式一致性协议,两阶段提交,raft以及其与paxos的区别;
15、提问环节;
6、三面:
1、自我介绍;
2、解释CAP;
3、解释分布式一致性协议,raft;
4、设计题:设计一个后端系统用于用于查询新闻,其中数据库最多只能承受1w的访问量:初步设计:连接路由+分布式缓存+超时机制+消息队列;
5、超时机制如何更新新闻,新闻需要存储哪些东西,如何设计key:优化:超时机制改为push;
6、如何进行路由,路由表如何查找:优化:map,红黑树,时间戳;
7、路由会有单点问题,如何解决:优化:一致性hash,分布式hash表;
8、分布式hash和普通hash有什么区别,优势是什么;
9、再谈谈超时机制,详细设计一下:优化:类似LRU这样的缓存更新;
10、如果每条新闻的超时时间不同呢:优化:优先级队列;
11、如何将这个优先级队列分布式化;
12、优先级队列的原理;
13、描述一下堆的插入和删除;
14、网络库的设计思路,如何一步步想到这些的;
15、未来对这个库优化思路;
16、技术规划是什么,最近在看哪些技术书籍;
17、了解哪些开源框架,了解头条的技术架构;
18、想在头条里从事什么,提问环节HR面:很轻松,简单的聊了几句;
7、其他:
1、Dubbo原理,Dubbo负载均衡策略;
2、数据库分库分表,采用的技术(Mycat,Sharding-jdbc);
3、数据库不停机数据拆分(而且业务不停,CAP限制了我,这个真不会);
4、分布式锁及其实现原理(Mysql,ZK,Redis);
5、表单防重提交(前端按钮置灰,后端幂等);
6、LRU,并且实现插入,删除复杂度O(1),(面试官说用HashMap加双向链表,但是HashMap的复杂度也不是O(1)啊);
7、微服务接口调用失败了咋整(主要根据业务类型,说了一下2PC,3PC,TCC,服务高可用,重试,熔断,降级);
8、接口重试以及原理(Feign,Ribon,Hystric,简单说一下,原理看过,说不太上来);
9、线程池的参数及其含义(回答了四种线程池和自定义线程池的参数,后面面试官告诉我Hystric也是这个原理);
10、线程池参数设定依据(分CPU密集型和IO密集型);
11、Mysql索引(引擎,索引类型,事务,锁行锁表,索引底层数据结构);
12、Mysql主键自增,加入当前主键是10,删掉该条记录之后,再插入一条,主键是10还是11(这个真不会,面试官说跟引擎相关);
13、HashMap和HashTable区别,HashSet原理;