腾讯音乐(TME)暑期实习状态+面经
各位腾讯音乐发offer了么?4.20面完hr+云证,hr面时说是5月份开始发offer,现在状态还是hr面,还在等。。。
面的后端开发,主go
面了3轮技术面+一轮技术面加面
一面:
go的gmp调度
go的context
问:(go的select题,运行状态(阻塞or not))
答出来了
Linux的select,poll,epoll(深入,太深了,只有epoll里面存的什么状态的文件描述符,没答出来,别的都答出来了)
想问数学,但是说是大一学的高数,变成写欧几里得算法(最大公约数),写了
磁盘调度算法
段页式,分页,分段
内存页调度算法
tcp握手,close_wait状态
tcp重传机制(超时重传,快重传)
MySQL隔离级别,提交读,默认隔离级别
问:(select count(*)和select count(1)哪个快(1为常数1)),
回答:不清楚,要是判断select *和某个属性的话可以通过判断命中索引来判断快慢
MySQL怎么查看是不是慢查询
MySQL回表查询
算法(120. 三角形最小路径和,直接动态规划从底到顶,时间o(n*m)+空间o(1),最优解)
基本都答出来了
二面:
go的context
问:(go的select题,运行状态(阻塞or not))
答出来了
Linux的select,poll,epoll(深入,太深了,只有epoll里面存的什么状态的文件描述符,没答出来,别的都答出来了)
想问数学,但是说是大一学的高数,变成写欧几里得算法(最大公约数),写了
磁盘调度算法
段页式,分页,分段
内存页调度算法
tcp握手,close_wait状态
tcp重传机制(超时重传,快重传)
MySQL隔离级别,提交读,默认隔离级别
问:(select count(*)和select count(1)哪个快(1为常数1)),
回答:不清楚,要是判断select *和某个属性的话可以通过判断命中索引来判断快慢
MySQL怎么查看是不是慢查询
MySQL回表查询
算法(120. 三角形最小路径和,直接动态规划从底到顶,时间o(n*m)+空间o(1),最优解)
基本都答出来了
二面:
go的切片和数组的区别(怎么样避免切片扩容带来的性能损耗,(unsafe直接修改容量【不太安全】)),还有别的方法么(想不出了)
go的map底层
tcp和udp的区别
tcp的可靠性怎么实现的(重传【超时重传,快重传】)
超时重传怎么确定的,超时重传怎么控制宽带空闲的(有个超时的计算公式,基于往返的时间,是可变的,通过滑动窗口控制流量,接收端返回ack可以有另一种方式【传回ack附带上已经收到的包的编号,发送端收到后可以不用重传已经收到的包】)
多路复用io(提醒一面问过,就过了)
Linux熟悉么用过什么命令(不怎么熟悉,用过vim,删除创建文件等命令,一般是win下编译好Linux下运行的文件,直接拿过去跑)
redis熟悉么?(MySQL更熟,转问MySQL)
MySQL的查询用什么优化(索引)
索引用的什么结构(B+树)
抢答(为什么用B+树),然后问(B+树和B树的区别【八股】)
MySQL的隔离级别
MySQL的隔离级别的控制(MVCC)
能不能解决幻读(答:幻读原因,可串行化能解决,通过Next-Key Locking控制,锁住索引和那一段范围的数据)
了解分布式么(不了解就没问)
场景题
用户听歌排行榜(百万级),每个用户一个小时更新一次听歌时长和排名,设计一个系统实现
redis:
存用户数据(ID,听歌时长,排名,过期时间)
zset,存用户听歌时长
map,存各个听歌时长的用户数目
MySQL:
存用户数据(所有用户【持久化】)
用户更新数据时,先去map中把原来的听歌时长-1,如果map相应的值变为0则从zset中删除该听歌时长,然后用户更新后的听歌时长对应的map+1,去zset中查询排名,更新排名。
数据过期时,存到MySQL,从redis中删除。
平时做项目时用缓存多么(查询多的时候会用到)
反问:表现怎么样?
基础知识挺牢固的,场景问题有些不足,不过毕竟都是要有经验才能回答好的,建议多看看了解多点。
【基本都答出来了】
编程题:(a了)
小红拿到了一个数组 a,每次操作小红可以选择数组中的任意一个数减去 x,小红一共能进行 k 次。
小红想在 k 次操作之后,数组的最大值尽可能小。请你返回这个最大值。
1≤len(a)≤10^5
1≤k,x,a≤10^4
示例1
输入: [7,2,1],3,2
输出: 2
解:最大堆,取堆顶,减x后放回,循环k次,放回堆顶
package main
import (
// "fmt"
"container/heap"
)
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param a int整型一维数组
* @param k int整型
* @param x int整型
* @return int整型
*/
type dui_max []int
func (d dui_max)Len()int{
return len(d)
}
func (d dui_max)Less(i,j int)bool{
return d[i]>d[j]
}
func (d *dui_max)Swap(i,j int){
(*d)[i],(*d)[j]=(*d)[j],(*d)[i]
}
func (d *dui_max)Pop()interface{}{
t:=(*d)[len(*d)-1]
*d=(*d)[:len(*d)-1]
return t
}
func (d *dui_max)Push(a interface{}){
*d=append(*d,a.(int))
}
func minMax( a []int , k int , x int ) int {
// write code here
dui:=dui_max{}
for i:=0;i<len(a);i++{
heap.Push(&dui,a[i])
}
for i:=0;i<k;i++{
t:=heap.Pop(&dui).(int)
t-=x
heap.Push(&dui,t)
}
return heap.Pop(&dui).(int)
}
三面:
go的map底层
tcp和udp的区别
tcp的可靠性怎么实现的(重传【超时重传,快重传】)
超时重传怎么确定的,超时重传怎么控制宽带空闲的(有个超时的计算公式,基于往返的时间,是可变的,通过滑动窗口控制流量,接收端返回ack可以有另一种方式【传回ack附带上已经收到的包的编号,发送端收到后可以不用重传已经收到的包】)
多路复用io(提醒一面问过,就过了)
Linux熟悉么用过什么命令(不怎么熟悉,用过vim,删除创建文件等命令,一般是win下编译好Linux下运行的文件,直接拿过去跑)
redis熟悉么?(MySQL更熟,转问MySQL)
MySQL的查询用什么优化(索引)
索引用的什么结构(B+树)
抢答(为什么用B+树),然后问(B+树和B树的区别【八股】)
MySQL的隔离级别
MySQL的隔离级别的控制(MVCC)
能不能解决幻读(答:幻读原因,可串行化能解决,通过Next-Key Locking控制,锁住索引和那一段范围的数据)
了解分布式么(不了解就没问)
场景题
用户听歌排行榜(百万级),每个用户一个小时更新一次听歌时长和排名,设计一个系统实现
redis:
存用户数据(ID,听歌时长,排名,过期时间)
zset,存用户听歌时长
map,存各个听歌时长的用户数目
MySQL:
存用户数据(所有用户【持久化】)
用户更新数据时,先去map中把原来的听歌时长-1,如果map相应的值变为0则从zset中删除该听歌时长,然后用户更新后的听歌时长对应的map+1,去zset中查询排名,更新排名。
数据过期时,存到MySQL,从redis中删除。
平时做项目时用缓存多么(查询多的时候会用到)
反问:表现怎么样?
基础知识挺牢固的,场景问题有些不足,不过毕竟都是要有经验才能回答好的,建议多看看了解多点。
【基本都答出来了】
编程题:(a了)
小红拿到了一个数组 a,每次操作小红可以选择数组中的任意一个数减去 x,小红一共能进行 k 次。
小红想在 k 次操作之后,数组的最大值尽可能小。请你返回这个最大值。
1≤len(a)≤10^5
1≤k,x,a≤10^4
示例1
输入: [7,2,1],3,2
输出: 2
解:最大堆,取堆顶,减x后放回,循环k次,放回堆顶
package main
import (
// "fmt"
"container/heap"
)
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param a int整型一维数组
* @param k int整型
* @param x int整型
* @return int整型
*/
type dui_max []int
func (d dui_max)Len()int{
return len(d)
}
func (d dui_max)Less(i,j int)bool{
return d[i]>d[j]
}
func (d *dui_max)Swap(i,j int){
(*d)[i],(*d)[j]=(*d)[j],(*d)[i]
}
func (d *dui_max)Pop()interface{}{
t:=(*d)[len(*d)-1]
*d=(*d)[:len(*d)-1]
return t
}
func (d *dui_max)Push(a interface{}){
*d=append(*d,a.(int))
}
func minMax( a []int , k int , x int ) int {
// write code here
dui:=dui_max{}
for i:=0;i<len(a);i++{
heap.Push(&dui,a[i])
}
for i:=0;i<k;i++{
t:=heap.Pop(&dui).(int)
t-=x
heap.Push(&dui,t)
}
return heap.Pop(&dui).(int)
}
三面:
问:你大学的课程学的哪些?
答:计算机网络,操作系统,数据库系统概论等
问:你们大学学的语言?
答:c++和java,大一学的c++大二学的java,go是自学的
问:那是c++和java更熟?
答:没有,go更熟悉,c++和java是课程需要学的
问:你问什么学go,从个人喜好讲?
答:因为go更小巧方便,搭建http请求什么的,相比于java,虽然java的应用范围很广。go语言的并发特性,对于云和并发有优势。所以选go。
问:叫你重新设计实现你这个项目,你会怎么设计实现?
答:鉴权,jwt(有时效性),用redis存,当时看完一个博客框架用的,就参考着用在项目上了。
问:那你的session怎么保存的呢?
答:redis保存,传输放在http头部,浏览器保存token在本地
问:那用redis的什么数据结构存呢?
答:map或者set都行,还可以设置过期时间,setnx
问:你这个项目是多人合作的是吧,你能说一下你们的分工么?
答:其实这个项目基本是我自己完成的,那个同学是跟着我一起学go的,我写完给他看。
问:他负责什么的呢?我看你这里还有前端,你是想要做前端还是后端?
答:负责看,跟着我一起学。我是只想做后端的,做前端是因为这个项目需要就去学的,因为只有一周时间,所以大部分时间是在写前端,边学边写。
问:我看你项目有点小,没什么好问的,问一下别的。
(感觉答得很烂)
问:使用tcp和udp实现的协议你知道哪些?
答:
tcp:文件传输协议,远程登录使用的Telnet,DNS
udp:DNS
DNS服务器在解析域名时使用的udp,与其他DNS服务器同步缓存时使用tcp
问:tcp是面向字节流的,是什么意思?
答:tcp是面向字节流的,udp是面向报文的,tcp在发送2个消息时,要是前一个消息的报文长度没满,后一个消息会直接接到前一个消息的后面,造成黏包,udp两个消息会分开成2个报文,所以不会出现黏包。
问:你说的都是现象,你能说一下tcp怎么实现面向字节流的么?
答:没有那么深入了解过
问:你能说一下tcp的rst位标志是什么时候使用的么?
答:只知道rst位表示重置,具体的没有去了解过。
问:你能说一下你了解的排序算法么?
答:冒泡,选择,快排,归并,堆
问:那你能说一下快排的实现过程么?
答:先选择数组下标中点为基点,把比中点数大的数放到左边,比中点数大的放到右边,然后继续对两边数组进行递归
问:你能说一下快排和冒泡的区别么?
答:快排和冒泡的时间复杂度不同,快排平均时间复杂度为nlogn,最坏为n^2;快排是不稳定的,冒泡是稳定的,快排在比较时会造成相同大小的数的相对位置发生改变。
go的map
go的GMP协程调度
问:你使用过我们的产品么?
答:用过qq音乐,现在用的是网易云音乐
问:你觉得网易云与qq音乐的差别,你为什么喜欢用网易云音乐?
答:歌单都在网易云,网易云的推荐系统符合我口味。
问:如果让你设计优化推荐系统,你会怎么做?
答:推荐系统应该都是机器学习的事,我感觉后端能做的只有增加标签,更加细化标签,从而能给机器学习提供更细化的数据,就能提高推荐的相关性。还可以统计听同一个标签歌的人还会听哪些歌,这样得到的数据也有相关性。
问:你对哪些开源项目感兴趣或者说你参与了哪些开源项目?
答:我对于之前看的一个教程的up开发的项目gin_vue_admin有兴趣,可以快速部署搭建服务。
问:你对于读研,国企和私企的看法?
答:我是想着直接工作,因为,相比于读研个几年,到时候出来还是得找工作,还不如出来工作3年,有3年工作经验更吃香。
问:你对互联网行业怎么看的?,,,(忘了),对公司文化和加班谈谈你的看法?
答:因为之后互联网企业对于云和大数据并发的热会持续下去,而这些正是适合go的,所以。,,,我的感觉是,有钱就干,加班没什么,因为我是实习生,了解的东西很少,加班肯定能学到更多东西。
问:你读过什么书?
答:开始学go时过了一遍教程的博客,然后就去读《go语言圣经》,然后刷了一个月力扣后去读《go读书笔记》,《go专家编程》,然后还有一本《go语言编程之旅》没读完,感觉有点深。
反问:请问我的表现怎么样?是很差么?
答:这个目前还不能给你答复,我得和之前面试的同事讨论后才能有结果。
加面问的东西很笼统就没搞面经。
答:计算机网络,操作系统,数据库系统概论等
问:你们大学学的语言?
答:c++和java,大一学的c++大二学的java,go是自学的
问:那是c++和java更熟?
答:没有,go更熟悉,c++和java是课程需要学的
问:你问什么学go,从个人喜好讲?
答:因为go更小巧方便,搭建http请求什么的,相比于java,虽然java的应用范围很广。go语言的并发特性,对于云和并发有优势。所以选go。
问:叫你重新设计实现你这个项目,你会怎么设计实现?
答:鉴权,jwt(有时效性),用redis存,当时看完一个博客框架用的,就参考着用在项目上了。
问:那你的session怎么保存的呢?
答:redis保存,传输放在http头部,浏览器保存token在本地
问:那用redis的什么数据结构存呢?
答:map或者set都行,还可以设置过期时间,setnx
问:你这个项目是多人合作的是吧,你能说一下你们的分工么?
答:其实这个项目基本是我自己完成的,那个同学是跟着我一起学go的,我写完给他看。
问:他负责什么的呢?我看你这里还有前端,你是想要做前端还是后端?
答:负责看,跟着我一起学。我是只想做后端的,做前端是因为这个项目需要就去学的,因为只有一周时间,所以大部分时间是在写前端,边学边写。
问:我看你项目有点小,没什么好问的,问一下别的。
(感觉答得很烂)
问:使用tcp和udp实现的协议你知道哪些?
答:
tcp:文件传输协议,远程登录使用的Telnet,DNS
udp:DNS
DNS服务器在解析域名时使用的udp,与其他DNS服务器同步缓存时使用tcp
问:tcp是面向字节流的,是什么意思?
答:tcp是面向字节流的,udp是面向报文的,tcp在发送2个消息时,要是前一个消息的报文长度没满,后一个消息会直接接到前一个消息的后面,造成黏包,udp两个消息会分开成2个报文,所以不会出现黏包。
问:你说的都是现象,你能说一下tcp怎么实现面向字节流的么?
答:没有那么深入了解过
问:你能说一下tcp的rst位标志是什么时候使用的么?
答:只知道rst位表示重置,具体的没有去了解过。
问:你能说一下你了解的排序算法么?
答:冒泡,选择,快排,归并,堆
问:那你能说一下快排的实现过程么?
答:先选择数组下标中点为基点,把比中点数大的数放到左边,比中点数大的放到右边,然后继续对两边数组进行递归
问:你能说一下快排和冒泡的区别么?
答:快排和冒泡的时间复杂度不同,快排平均时间复杂度为nlogn,最坏为n^2;快排是不稳定的,冒泡是稳定的,快排在比较时会造成相同大小的数的相对位置发生改变。
go的map
go的GMP协程调度
问:你使用过我们的产品么?
答:用过qq音乐,现在用的是网易云音乐
问:你觉得网易云与qq音乐的差别,你为什么喜欢用网易云音乐?
答:歌单都在网易云,网易云的推荐系统符合我口味。
问:如果让你设计优化推荐系统,你会怎么做?
答:推荐系统应该都是机器学习的事,我感觉后端能做的只有增加标签,更加细化标签,从而能给机器学习提供更细化的数据,就能提高推荐的相关性。还可以统计听同一个标签歌的人还会听哪些歌,这样得到的数据也有相关性。
问:你对哪些开源项目感兴趣或者说你参与了哪些开源项目?
答:我对于之前看的一个教程的up开发的项目gin_vue_admin有兴趣,可以快速部署搭建服务。
问:你对于读研,国企和私企的看法?
答:我是想着直接工作,因为,相比于读研个几年,到时候出来还是得找工作,还不如出来工作3年,有3年工作经验更吃香。
问:你对互联网行业怎么看的?,,,(忘了),对公司文化和加班谈谈你的看法?
答:因为之后互联网企业对于云和大数据并发的热会持续下去,而这些正是适合go的,所以。,,,我的感觉是,有钱就干,加班没什么,因为我是实习生,了解的东西很少,加班肯定能学到更多东西。
问:你读过什么书?
答:开始学go时过了一遍教程的博客,然后就去读《go语言圣经》,然后刷了一个月力扣后去读《go读书笔记》,《go专家编程》,然后还有一本《go语言编程之旅》没读完,感觉有点深。
反问:请问我的表现怎么样?是很差么?
答:这个目前还不能给你答复,我得和之前面试的同事讨论后才能有结果。
加面问的东西很笼统就没搞面经。