今日头条面经汇总
算法
- 翻转二叉树
- 最大连续子串和
- 给一棵边权树树找到最大路径,要找到两个端点怎么办
- 给一个字符串和单词列表,判断字符串能不能由这些单词组成
- 给定一组股票的价格,最多买卖0一次,问最大收益
- !!!二叉树任意两个节点之间路径的最大长度
- 二叉树的深度
- lfu
- 一个链表 奇数位升序偶数位降序 让链表变成升序的
- 给你一个循环后的数组 比如 45123 问你恢复原数组 最少几步 原数组是升序的
- 一个数组 里面存着 1 -- 无穷大的数 但是他的十位数 比如 10 拆成了 1 和0 问你这样拆分的数组里 让你求i位置的数字是啥 数字肯定就是0-9的数
- !!! 0-25表示A-Z,给一个数字字符串,求有多少种解码方式
- 给定一个乱序的链表,现在有一个操作,可以把链表任意位置的值移动到链表的最后。求链表排序所需要的最少操作次数。
- 已知一个函数rand3() 可以等概率随机产生1,2,3,请实现函数rand7(),可以等概率随机产生1~7
- 当你在搜索框输入h的时候会出现一些h开头的单词,然后再输入一个a(ha),会出现ha开头的很多单词,现在给你一个词典,让你实现这个功能,当用户动态的输入字母时,跳出以此字符串为前缀的所有单词,要求时间复杂度最优
- 找一下两个节点的LCA
- !!!给出k对括号的全部正确匹配方案,如k=2,输出()(),(())
- 将一些柱子整齐的摆在一行(立着),高度存在数组height[]中,height[i]表示第i个柱子高为height[i],然后往凹下去的地方倒水,问一共能蓄多少单位水,比如[5,1,3,4,5,1,3],答案是7 2=9
- 快速排序
- 抛2k+1次硬币,问正面次数比背面多的概率是多大,并讲出数学证明思路
- 给N个数字,返回这N个数字能组成的所有二叉搜索树
- 给一个字符串,得到它字典序最大的子序列
- n个整数的无序数组,找到每个元素后面比它大的第一个数
- LRU
- 实现一个二叉树的持久化方案
- 实现二叉树的层序遍历
- 旋转打印矩阵
数据库
- 索引为什么用B+树 为什么不用B树
- redis为什么是单线程
- redis单线程有什么缺点,如果用多线程有什么 优缺点
- aof,rdb,优点,区别
- 数据库的特性
- 如何实现数据库的原子性,可以用伪代码实现吗
- 数据库中的WAL技术
- 查看索引使用情况需要哪个关键字
- 修改MySQL字符集需要哪个关键字
计算机网络
- 三次握手、四次挥手
- 三次握手的隐患
- TCP/Ip
- 滑动窗口
- HTTP2
- cookie和session
- HTTP缓存
- GET和POST
- POST和PUT
- 端口的作用
操作系统
- linux内核存储方式
- 什么是页式存储
- Linux线程与进程的区别
- 键盘敲一个A,发生了什么
- 介绍5种IO模型
- 异步编程的事件循环
- 操作系统为什么要分内核态和用户态
- 为什么要有page cache,操作系统怎么设计的page cache
- 协程
设计
- 假设现在有一个情景,一些客户端疯狂的访问你的服务器,然后你现在要限制他们的访问,比如说一分钟只准访问100次,怎么实现这个功能,伪代码实现
- 长短url
## 一面
一面提前去了,结果前面一个面试官没结束面试,后面给换了一个面试官。
问的问题很多,只能凭记忆来了。
1. 先自我介绍一下。
2. 你这个时空索引是什么,怎么做分布式时空索引说一下
3. 说一下你这个项目吧,你在这个项目中主要干什么
4. 你对锁了解多少?无锁HashMap怎么设计?(这个自己找死,索性面试官接了个电话换了个话题)
4. 你对Hadoop了解多少?知道HDFS的机制吗?是如何分块的,每块保存多少份?为什么分块大小是这个?介绍一下Namenode和datanode。
5. 介绍一下MapReduce怎么做到?在map阶段和reduce阶段分别做了什么工作?
6. 你这些语言都会吗?(c,python,scala)强行扯了一波怎么学习Scala的(基本上就是Coursera的课)
7. jvm的内存怎么划分的?什么是本地方法栈?
8. java的锁了解吗?有哪些锁,都说一下?
9. 进程与线程的区别
10. 进程的通信方式
11. 进程的内存模型(没理解具体要问什么,直接跳过)
12. 什么时候会引起进程的切换?加锁会让进程切换吗?(自旋锁)
12. 写一道题:二叉树的层次遍历。写完解释一下意思,面试官问用递归怎么写?简单描述了一下思想。
13. 你有什么问题需要问我的?问了一下部门具体干什么的,偏业务还是偏底层。面试官说偏业务
14. 时间到了,就不问网络了
## 二面
1. 自我介绍一下
2. 我先看看一面面试官都问了你啥?你先做一道题,给出了一道题,给出输入输出,反转字符串。比如“ abc hello sam ”反转成“ cba olleh sam ”。
3. 你说一下你第一个项目?storm和jstorm有啥区别?
4. Kafka你了解多少?kafka的基本概念说一下?你们这么项目是怎么使用kafka的?多个消费者同时消费一个topic,它们如何消费的?
5. 你这里用到了redis,了解redis吗?(不了解,换了一个)
6. 你这里一旦没写入redis,但是消费了该数据,怎么保证数据的正确性。讲到实际场景数据要exact at once。说了一下jstorm的保证机制,没达到点上,后面又说用事务来做。面试官说还没到点上。后面给我解释了一波。
7. 你对hadoop、spark了解多少?用过多少?你还了解其他大数据相关的东西吗?说了一下毕设中了解的raft算法,以及说了一些raft的基本原理。
8. 你们这个云集存储项目是干啥的?这里把项目介绍了一下。
9. 你用mysql吗?(不用,我用pg)
10. 用到什么程度?简单的表,在处理时并不复杂。
11. 再做一道题。[1 1 2 2 3 3 4 5 5]原地去重,要求最后[1 2 3 4 5 1 2 4 5]前5个数是去重的结果,后面的数是重复的数,顺序随意。要求原地,并且面试官强调代码只有10几行,写多了肯定错。
12. 写完看了一下。面试发现一个小问题,给说了一下,一开始没理解,后面理解了说把语句调到前面就行。他说没问题。
13. 你了解哪些保证线程安全的手段?
14. 你有什么问题要问的?(这边实习需要全职吗?喜欢全职,一般要求4天)
## 三面
都不知道自己在干啥?
面试官给出了一个情景题,有两个数据集A和B,A的属性字段有(logid, uid, item_id, attrs1, ts),B的属性字段有(logid, uid, item_id, attrs2, ts),把这两个东西合并。用你最喜欢的方式。
一开始题目意思都没有理解,向他请教了一波,问他是否是join操作,是否是写SQL语句。面试官给我说,你可以理解为join操作,不一定使用SQL语句,用你最熟悉的方式解决这个问题。
强行说了一波MapReduce怎么做,面试官给纠正了,这么做存在什么问题?后面又给A和B加了一些限定条件,问我怎么做?比如A里面uid, item_id可能有多行,你怎么merge。所幸说了一个笛卡儿积,后面才可以继续下去。
后面有限定了B里面没有重复,要么为0,要么为1。怎么做?你先写一个试试?
写了一个。分析一下时间复杂度,后面还有没有更优化的方案,你这里为什么要排序?(便于查找)怎么利用只有0和1这个条件?后面换成Map来做,又分析了一波时间复杂度。
上述场景切换到流式场景,你怎么做?先写个伪代码,解释一下思路。
后面没写伪代码,只是说了一下思路。后面问,A和B那个可以删除?我去这里又蒙蔽了。后面他把条件说了一下,又分析了一波,觉得A和B里的元素都不能删除。他分析了一下,说再想想,后面分析了一波,说A里面凡是B里有的可以删除,没有的不能删除。
主要总结的是后台研发岗和机器学习岗的面经,反正头条的揍性就是上来一堆算法题,刷题吧骚年!
参考
https://mp.weixin.qq.com/s/EwG6K2x_JUzb3PtEYh9jFg
https://www.nowcoder.com/discuss/71505?type=0&order=0&pos=15&page=1
https://www.nowcoder.com/discuss/72122
http://www.cnblogs.com/weiyinfu/p/8546080.html
https://www.nowcoder.com/discuss/71748?type=0&order=0&pos=6&page=0
http://www.codingstar.cn/article/57