第五届字节跳动青训营(寒假) - 后端练习题&官方答案
收集自字节青训营官方账号多条动态
想知道青训营笔试题怎么考?快来这里看看练习题吧!
Day1
选择题 1:
Client 在使用 Https 协议访问网站进行通信的过程中,以下说法正确的是?
A. 只用到了对称加密技术
B. 只用到了非对称加密技术
C. 没有用到任何加密技术
D. 同时用到了对称加密和非对称加密技术
选择题 2:
以下哪些是操作系统中堆和栈的区别?
A. 增长方向
B. 空间大小
C. 分配方式
D. 管理方式
1、D;2、ABCD
Https = http + S
Day2
选择题 1:
Go 中关于整型切片的初始化,以下正确的是?
A. s := []int{1, 2, 3, 4, 5}
B. s := make([]int)
C. s := make([]int, 0)
D. s := make([]int, 5, 10)
选择题 2:
以下哪些操作可能触发本地 CPU cache 失效?
A. 本地读取
B. 本地写入
C. 远端读取
D. 远端写入
1、ACD;2、D
Cache一致性协议:MESI
Day3
选择题 1:
以下哪些是解决哈希冲突的手段?
A. 拉链
B. 开放地址
C. 再散列
D. 滑动窗口
选择题 2:
建立 TLS1.2 连接需要几次握手?
A. 3
B. 4
C. 6
D. 7
1、ABC;2、D
tcp三次握手 + tls四次握手
Day4
选择题 1:
MySQL 数据库中是通过以下哪种日志实现 MVCC 机制的?
A. Undo Log
B. Redo Log
C. Binary Log
D. Slow Log
选择题 2:
关于排序算法以下结论正确的是?
A. 归并排序任何情况下都能保持时间复杂度为 O(nlog n)
B. 插入排序时间复杂度为 O(nn),所以在任何情况下都比快速排序慢
C. 快速排序的最坏情况下的时间复杂度为 O(n*n)
D. 希尔排序任何情况下都比插入排序更快
1、A;2、AC
MVCC 机制:Multi-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问;在编程语言中实现事务内存。
Day5
选择题 1:
以下哪些是 RDBMS 跟常见的对象存储系统的不同点?
A. 数据库支持事务
B. 数据库向用户暴露 put/get 接口
C. RDBMS 一般存储结构化数据
D. 数据库里的数据不能修改,只能删除后重新写入
选择题 2:
常见的存储系统 IO 性能优化方式有哪些?
A. 尽可能多设计随机读写逻辑
B. 预读
C. 减少 IO 路径上的内存拷贝
D. batch 写入
1、AC;2、BCD
Day6
选择题 1:
关于 MD5 以下哪些说法是正确的?
A. MD5 可以用于加密密码
B. MD5 不可逆
C. 对于不同的输入, MD5 一定输出不一样的结果
D. 对于不同长度的输入,MD5 一定输出相同长度的结果
选择题 2:
关于红黑树以下说法正确的是?
A. 红黑树是平衡二叉树,任意两个子树的高度差不超过 1
B. 红黑树从一个节点到该节点的子孙节点的所有路径上包含相同数目的红色节点
C. 红黑树插入节点时最多经过 3 次旋转达到平衡
D. 红黑树进行插入操作时需要解决红红冲突
1、BD;2、CD
MD5的A选项有歧义。不需要解密的话,可以用MD5加密。
Day7
选择题 1:
在最好情况下,下列排序算法中,哪些排序算法所需比较的关键次数最少?
A. 冒泡
B. 归并
C. 快速
D. 直接插入
选择题 2:
以下哪些是 Go 支持的指针运算?
A. 通过 & 取地址
B. 对指针进行自增
C. 下标运算
D. 通过 * 解引用
1、AD;2、AD
Day8
选择题 1:
在 MTU=1500 字节的以太网中,TCP 报文的最大分段大小为多少字节?
A. 1440
B. 1460
C. 1420
D. 1480
选择题 2:
关于经典的 Skiplist(原始论文实现)以下结论正确的是?
A. 每次的查找都从 head 节点的第 0 层(最底层)开始寻找
B. skiplist 的插入节点的层级都是固定的
C. skiplist 的元素都是有序的
D. skiplist 平均查询时间复杂度为 O(log n)
1、B;2、CD
1460=1500-20-20,减去TCP和IP报文的首部。
Day9
【青训营 - 后端练习题 - DAY9】
选择题 1:
以下哪些排序算法是不稳定的?
A. 快速排序
B. 归并排序
C. 基数排序
D. 堆排序
选择题 2:
关于 Go 语言以下结论正确的是?
A. 在多核机器中,核数越多,使用多个 goroutines 写入 sync.Map 的性能越好
B. 只调用一次 rand.Seed,则之后 rand.Int 的生成序列是固定的
C. 放入 sync.Pool 中的结构体可能随时被回收
D. Goroutine 的栈不仅会增长而且还会缩容
1、AD;2、BCD
Pool是一个可以分别存取的临时对象的集合。
Pool中保存的任何item都可能随时不做通告的释放掉。如果Pool持有该对象的唯一引用,这个item就可能被回收。
Pool可以安全的被多个线程同时使用。
Pool的目的是缓存申请但未使用的item用于之后的重用,以减轻GC的压力。也就是说,让创建高效而线程安全的空闲列表更容易。但Pool并不适用于所有空闲列表。
编程题
评论区有网友给出了答案。
限定语言:C、C++、Java、Python、JavaScript V8、Go
编程题1
题目
实现一个 36 进制的加法 0-9 a-z。
示例
输入:[“abbbb”,“1”],输出:“abbbc”
编程题2
题目
抖音电影票业务支持电影院选座,需要在用户买票时自动推荐座位,如果一个用户买了多张票,则需要推荐相邻(上下相邻、左右相邻都可)的座位。现在使用一个二维数组来表示电影院的座位,数组中 0 表示未被选座,1 表示已被选座或者为障碍物,请实现一个方法求出给定影院中最大可推荐的相邻座位个数。
示例
输入:
[1,0,0,1,0,0,0]
[1,0,0,0,0,1,1]
[0,0,0,1,0,0,0]
[1,1,0,1,1,0,0]
输出:18
编程题3
有效 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
例如:“0.1.2.201” 和 “192.168.1.1” 是有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是无效 IP 地址。
给定一个字符串 s,非数字的字符可替换为任意不包含在本字符串的数字,同样的字符只能替换为同样的数字,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你不能重新排序或删除 s 中的任何数字,你可以按任何顺序返回答案。
示例 1
输入:20212118136
输出:
20.212.118.136
202.12.118.136
202.121.18.136
202.121.181.36
示例 2
输入:11a2b22a037
输出:
114.252.240.37
115.242.250.37(我自己增加的,原题只有上面的a=4,b=5,我把a,b互换了一下)
力扣题 93. 复原 IP 地址的加强版。
from typing import List
class Solution:
def restoreIpAddresses(self, s: str) -> List[str]:
SEG_COUNT = 4
ans = list()
segments = [0] * SEG_COUNT
def dfs(segId: int, segStart: int):
# 如果找到了 4 段 IP 地址并且遍历完了字符串,那么就是一种答案
if segId == SEG_COUNT:
if segStart == len(s):
ipAddr = ".".join(str(seg) for seg in segments)
# ans.append(ipAddr)
ans.append(segments[:])
return
# 如果还没有找到 4 段 IP 地址就已经遍历完了字符串,那么提前回溯
if segStart == len(s):
return
# 由于不能有前导零,如果当前数字为 0,那么这一段 IP 地址只能为 0
if s[segStart] == "0":
segments[segId] = "0"
dfs(segId + 1, segStart + 1)
# 一般情况,枚举每一种可能性并递归
addr = 0
seg = ""
hasChar = False
for segEnd in range(segStart, len(s)):
if not hasChar and '0' <= s[segEnd] <= '9':
addr = addr * 10 + (ord(s[segEnd]) - ord("0"))
seg += s[segEnd]
if 0 < addr <= 0xFF:
# segments[segId] = addr
segments[segId] = seg
dfs(segId + 1, segEnd + 1)
else:
break
else:
hasChar = True
seg += s[segEnd]
if len(seg) == 4:
break
segments[segId] = seg
dfs(segId + 1, segEnd + 1)
dfs(0, 0)
return ans
cases = ["25525511135","11a2b22a037","20212118136"]
for case in cases:
print(Solution().restoreIpAddresses(case))
# TODO:穷举各字母可以表示的数字,得到最终答案。