今日头条面试题
第一波
笔试
40分钟 纸上写代码,至少答出一题:
- 一个环有10个节点,编号0-9。从0点出发,走N步又能回到0点,共有多少种走法?
- 一个乱序数组,求第K大的数。排序方式使用字典序。
一棵二叉树,求最大通路长度。(即最大左右子树高度之和)
面试
进程和线程的区别,使用线程真的能节省时间?
- go协程的调度方式,使用协程真的能节省时间?
- 水平触发边沿触发的区别?在边沿触发下,一个socket有500的数据,已读取200然后不再处理,是不是剩下的300就永远无法读取?
有函数如下
func t(i int) (i int){
defer i++
return 1
}
输入1,返回什么?
设计http协议,A端发送 AAAA,至少让B端知道AAAA已发送完成。
- 流量总入口为api_gateway,api_gateway挂了会导致全部挂挂,用什么机制增大可用性?
- mysql为什么要用b+树,不用平衡二叉树做索引结构?
- 创建数据库索引应该怎么考虑?
- 使用int 做primary key和使用string 有什么优劣?
- 数据库分表的方法?
表结构,订单纪录:
ID, uid, product_id
1 1 1
2 1 2
3 2 1
写一个语句,求卖的最好的 top 10 product_id。
微服务,A服务请求B服务B1接口,B1接口又请求A服务A2接口。会不会有问题?
- 不使用高级工具,只使用Linux自带的工具,你会如何debug?
- 如何预估一个mysql语句的性能?
go函数中,返回值未命名,发生了panic,但是在函数内recover了。函数返回什么值?比如(伪代码):
func t() int{
defer recover()
panic("hi")
return 1
}
如果是在命名函数中呢?
func t() (i int){
defer recover() and i=3
panic("hi")
return 1
}
输入1,上面函数的返回值是?
socket中,在tcp协议层面,数据分为10个报文发放。1-7次很顺利,第8次丢失。
这次通信一定失败吗?
如果第8次数据会重发,那在接收端是不是:先读取到1-7次的数据,然后读取到8-10次的数据?还是9-10次的数据会先到达?
第二波
手写程序
一个数字字符串被5个竖线分隔为6段,如:
123|41|025|43|2|1
竖线可以自由移动(两个竖线不能紧贴),求满足条件:所有分段的数字小于600(如上,123,41,25,43,2,1即满足条件)的所有结果free -h,buffers 和cached有什么不同
- 后台进程有什么特点,如果要你设计一个进程是后台进程,你会考虑什么
- 僵尸进程是什么,如果产生一个僵尸进程,如何查找僵尸进程
- 孤儿进程是什么
- 一个进程有20个线程,在某个线程中调用fork,新的进程会有20个线程吗?
- tcp/ip 流量控制和拥塞控制
- 301/302有什么区别?应用上有什么异同。
- 50X相关错误码的内涵是什么?
- close wait和time wait是什么?如何排查?有什么意义?
- http req和resp的中数据有哪些
- 什么是连接的半打开,半关闭状态
- 假如一个业务依赖单点redis,此redis故障将导致业务不可用,如何改进
- redis sharding有哪些做法
- 当大量数据要求用redis保存,单机单点难以满足需要,设计(换寻找)一个负载均衡的方案
- 当redis 采用hash做sharding,现在有8个节点,负载方案是 pos = hash(key) % 8,然后保存在pos节点上。这样做有什么好处坏处?当8个节点要扩充到10个节点,应该怎么办?有什么更方便扩充的方案吗?(一致性hash, presharding)
- 如何保证redis和数据库数据的一致性。比如用户名既保存在数据库,又保存在redis做缓存。有如下操作 update_db(username); update_redis(username)。但是执行update_db后故障,update_redis没有执行。有什么简单办法解决这个问题。
来自 大脸猫 写于 2018-09-07 11:24 -- 更新于2020-10-19 13:06 -- 5 条评论