字节跳动校招提前批

是学长给推荐的内推机会,很希望能把握住,就是可惜呀

一面 2019/7/4

自我介绍

先是自我介绍以及简历,然后面试官让我讲自己觉得有提升的项目

第一题笔试:

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type tree struct {
v int
ln *tree
rn *tree
}

var num = map[int]int{}

func main() {
num = make(map[int]int, 10)
dp(&tree{}, 0)
}

func dp(node *tree, i int) {
num[i] = node.v
if node.rn != nil {
dp(node.rn, i+1)
}
if node.ln != nil {
dp(node.ln, i+1)
}
}

tcp四次挥手,第四次之后客户端做了什么

面试官的意思应该是问首先发起释放连接请求的一方最后发送ACK报文时等待2MSL时间的问题,但是由于当时的我并不清楚所以没有说出来

计算机内核态和用户态,什么时候切换

缺乏对计算机基础知识,并不清楚,之后了解到:

  • 内核态:控制计算机的硬件资源,并提供上层应用程序运行的环境
  • 用户态:上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源
  • 切换的三种情况:系统调用,异常事件,外围设备的中断
  • 参考

mysql索引原理

这里因为我刚刚看完所以比较清楚,主要讲了b树和b+树对平衡二叉树的改进点

get/post请求的区别

这个我回答的是很基础的点,然而当我看到了这篇文章

别急,还有一篇文章,请对比上一篇文章,不想对比的可以直接看第一条

首先声明这里我没有去测试也没有去看RFC标准文档,我觉得如果去探讨已经偏离了我们的目标–需要怎么样回答这个问题,我觉得按照问题来说,只需要回答出上面文章中的w3c标准答案已经够了,因为这是http协议中的规定,并非是tcp协议中的规定

session/cookie区别及特点

这个问题我觉得和上一题一样,但是我没有再去google了。。。

思考题

这个我没有思考出来,也没有去仔细的google,直到我朋友发了一个链接给我,嗯,代码很长,解释很短,我也不明白他怎么看懂的,反正我现在待解

二面 2019/7/8

笔试题:
一组字符串全部由数字1-9组成,分割成6个子串,并且要求每个子串的数值不大于600,请打印所有的分割结果

这个面试管给了一个很基本的要求就是不能暴力解决(吐槽一下,面试官原话是说不能遍历,,,这个困扰我很久),因此我困扰了很久,直到面试官说有没有思路的时候,我还是决定把自己的想法说出来
想法:不能遍历的话就是说不能对每个字符进行遍历,不遍历的思路我知道的很少,甚至没有,所以我觉得最终肯定还是得遍历,但是如果说不能遍历是说不能暴力的话,就不一样的,我的遍历可以控制条件,让其提前结束,简单说就是剪枝,最后其实解法很简单,就是简单的深搜+剪枝

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import (
"fmt"
"strconv"
)
func main() {
s:="1245152451321211"
dp(s,6,"")
}

func dp(s string,n int,re string){
ls:=len(s)
if ls <=n*3 && ls > n {
if n == 1 {
fmt.Println(re+s)
}

for i:=1;i<=ls && i<=3;i++{
now,_:=strconv.Atoi(s[:i])
if now<=600 {
dp(s[i:],n-1,re+s[:i]+"*")
}
}
}
}

面试题:
golang的channel长度为0时有什么情况,为1或者更多有什么情况

自己回答的很烂,当时是想回答为0时会直接panic,但是又觉得会报错这么明显的问题应该不会问,就认为是自己记错了,当成1和更多的2种情况来判断了,失误呀

微信公众号服务端如果确定用户的身份,即自己的服务器怎么通过微信方以及用户方来确定用户的唯一性

这里我本身不记得具体的流程,在于面试官的沟通过程中思考到了opendid这个概念,其中考虑过用重定向到微信端,但是我忘记了怎么重定向于是自我否定了,后面看了下微信文档,是如果你要获取用户的opendid请带上自己的token以及重定向后要跳向的链接,从而达到获取用户信息
其中面试官又提到了如果确定微信所给的openid是这个用户的并且如果微信给的openid不正确怎么处理,这个地方暂时没有更好的思路,如果有人知道请告诉我

为什么使用websocket(关于我的一个项目),用http复用如何?

首先说明我不懂http复用,然后我说是为了实现及时通讯,因为http是发送完就关闭,所以面试官提出了http复用问题,从他的描述我认为是可行的,事后,我觉得因为http复用依旧是http所以它会返回报文,增加了不必要的数据传输,可惜是事后才想明白。
详解:未完成的websocket知识详解

redis有哪些数据结构,对于k-v的读取方式的时间复杂度是多少

我回答有k,k-v,集合(包括有序,无序,无重复),hash,但是实际上还有列表,然后时间复杂度其实是需要考虑redis是怎么去读取k-v的,在我的想法中似乎已经默认它的底层是链表形式保存了,所以我觉得应该采用hash来保存,而不是索引或者遍历查找,然后面试官也没有指出我的错误而是问我hash的桶应该设置多大的大小,这里我就懵了
事后我再次回顾了一下redis的设计与实现的书,其实很多的数据结构都是它自己实现的,k-v应该是采取数组

tcp客户端/服务端最多能建立多少个链接

面试官:tcp客户端能最多能同时建立多少个tcp链接?
我:应该是根据系统的端口数来限制的
面试官:那能给个具体的数吗?
我:。。。(这里我考虑过说六万多的,但是因为具体多少我不记得了所以就没有说出来,我建议是说出来至少证明你的思考是没有问题的)
面试官:那服务端能建立多少个呢?
我:。。。也是根据端口数吧,这样的话我觉得是服务端最大数量是根据端口数来限制,但是客户端就是根据系统的内存,cpu之类的来限制的(这里我已经想自成体系了,,,因为我确实不了解这个方面的知识,只是根据一个进程能监听一个端口那么服务端就是根据端口来判断的,其实是很大的错误)
详解见:未完成的tcp详解

一个进程本身有10个线程,其中一个线程fork了自己的父进程,问一下新的子进程有多少个线程

面试官:。。。(如上)
我:应该是一个线程,因为线程并不能访问父进程的内存空间,所以它所能获取到的只有自己本身的内存数据,因此fork的子进程应该只有一个线程就是自己。
这里我其实是纠结的,因为学习的方向问题,很少接触这类知识,只能是根据自己的了解去推断,然后我纠结的点是线程是互相内存共享的,那也应该知道其他的线程数据,所以我只能是二选一回答了- -
详解见:未完成的linux进程线程详解