第五届字节跳动青训营(寒假)—— 后端练习题

第五届字节跳动青训营(寒假)—— 后端练习题

Day1

选择题

1.Client 在使用 Https 协议访问网站进行通信的过程中,以下说法正确的是?
A. 只用到了对称加密技术
B. 只用到了非对称加密技术
C. 没有用到任何加密技术
D. 同时用到了对称加密和非对称加密技术

解:D

对称加密: 加密和解密过程用的同一个密钥,速度快

非对称加密: 加密用的是公钥(对外公开),解密用的是私钥(解密端保留),速度慢

https传输二者均用到了,敏感数据用非对称,其余大部分数据用对称

第五届字节跳动青训营(寒假)—— 后端练习题_第1张图片

2.以下哪些是操作系统中堆和栈的区别?
A. 增长方向
B. 空间大小
C. 分配方式
D. 管理方式

解:ABCD

增长方向、空间大小: 栈是由高到低,堆是由低到高,因为栈是一块连续的空间,在分配的时候就规定好了最大的量,不可能无限增长,因此是由低到高,而系统是用链表来存储堆,自然没有空间限制(只受制于虚拟内存),因此可以从低到高分配。

管理方式: 堆归程序员管,栈归操作系统管

分配方式: 堆是动态分配,栈是动静都可以(可变),但是栈的动态是操作系统完成,堆不是。

编程题

题目

实现一个 36 进制的加法 0-9 a-z。

示例

输入:[“abbbb”,“1”],输出:“abbbc”

解答:

def solution(x,y):
    example = "0123456789abcdefghijklmnopqrstuvwxyz"
    i = len(x) - 1
    j = len(y) - 1
    carry = 0
    res = ""

    while i>=0 and j>=0:
        x_value = example.find(x[i])
        y_value = example.find(y[j])
        if x_value + y_value +carry >= 36:
            temp = (x_value + y_value + carry)%36
            res = example[temp+carry] + res
            carry = 1
        else:
             res = example[x_value+y_value+carry] + res
             carry = 0
        i-=1
        j-=1

    #x还有
    while i>=0:
        if example.find(x[i])+carry == 36:
            res = "0" + res
            carry = 1
        else:
            res = example[(example.find(x[i])+carry)] + res
            carry = 0
        i-=1

    #y还有
    while j>=0:
        if example.find(y[j])+carry == 36:
            res = "0" + res
            carry = 1
        else:
            res = example[(example.find(y[j])+carry)] + res
            carry = 0
        j-=1

    #xy都没了
    if carry == 1:
        res = "1" + res

    return res

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)

解:ACD

make函数必需指定size

选择题 2:
以下哪些操作可能触发本地 CPU cache 失效?
A. 本地读取
B. 本地写入
C. 远端读取
D. 远端写入

解:D

编程题

题目

抖音电影票业务支持电影院选座,需要在用户买票时自动推荐座位,如果一个用户买了多张票,则需要推荐相邻(上下相邻、左右相邻都可)的座位。现在使用一个二维数组来表示电影院的座位,数组中 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

解答:

def search(arr, x, y, xmax, ymax):
    if x >= xmax or y >= ymax or x < 0 or y < 0:
        return 0
    if arr[x][y] == 1:
        return 0
    count = 1
    arr[x][y] = 1
    count += search(arr, x+1, y, xmax, ymax)
    count += search(arr, x-1, y, xmax, ymax)
    count += search(arr, x, y+1, xmax, ymax)
    count += search(arr, x, y-1, xmax, ymax)
    return count

def solution(arr):
    xmax = len(arr)
    ymax = len(arr[0])
    max = 0
    for x in range(len(arr)):
        for y in range(len(arr[0])):
            res = search(arr, x, y, xmax, ymax)
            if res > max:
                max = res
    return max

Day3

选择题

选择题 1:
以下哪些是解决哈希冲突的手段?
A. 拉链
B. 开放地址
C. 再散列
D. 滑动窗口

解:

解决哈希冲突的方法:

1.开放定址(线性探测、二次探测、伪随机探测):发生冲突用特定规则找其他位置放置

2.再散列(再哈希):发生冲突进行二次(多次)哈希计算,直到不发生冲突

3.拉链(链地址):发生冲突就在冲突位置后接一个链表存放冲突元素

4.建立公共溢出区:建立一个地方放所有发生冲突的元素

选择题 2:
建立 TLS1.2 连接需要几次握手?
A. 3
B. 4
C. 6
D. 7

解:D

tcp三次握手+tls四次握手

tcp三次握手:

第五届字节跳动青训营(寒假)—— 后端练习题_第2张图片

tls四次握手图如day1选择题1

编程题

题目

有效 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。

例如:“0.1.2.201” 和 “192.168.1.1” 是有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “[email protected]” 是无效 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

解答:

def is_validate(x):
    if not x or (x[0] == "0" and len(x) > 0) or int(x) > 255:
        return False
    return True

def solution(s):
    n = len(s)
    res = []
    for i in range(3):
        for j in range(i+1,i+4):
            for k in range(j+1,j+4):
                if i<n and j<n and k<n:
                    s1 = s[0:i+1]
                    s2 = s[i+1:j+1]
                    s3 = s[j+1:k+1]
                    s4 = s[k+1:]
                    if all(map(is_validate,[s1,s2,s3,s4])):
                        res.append(s1+"."+s2+"."+s3+"."+s4)
    return res

Day4

选择题

选择题 1:
MySQL 数据库中是通过以下哪种日志实现 MVCC 机制的?
A. Undo Log
B. Redo Log
C. Binary Log
D. Slow Log

解答:A

MVCC:帮助做到可重复读,对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性

undo日志版本链的作用:记录某个数据历次被修改的版本,并通过回滚指针连接起来,当发生数据回滚时可以通过undo版本链恢复到以前的数据。如下图

第五届字节跳动青训营(寒假)—— 后端练习题_第3张图片

  • trx_id:当前事物id
  • roll_pointer:指向上一个操作

选择题 2:
关于排序算法以下结论正确的是?
A. 归并排序任何情况下都能保持时间复杂度为 O(nlog n)
B. 插入排序时间复杂度为 O(n
n),所以在任何情况下都比快速排序慢
C. 快速排序的最坏情况下的时间复杂度为 O(n*n)
D. 希尔排序任何情况下都比插入排序更快

解答:AC

第五届字节跳动青训营(寒假)—— 后端练习题_第4张图片

Day5

选择题

选择题 1:
以下哪些是 RDBMS 跟常见的对象存储系统的不同点?
A. 数据库支持事务
B. 数据库向用户暴露 put/get 接口
C. RDBMS 一般存储结构化数据
D. 数据库里的数据不能修改,只能删除后重新写入

解答:AC

选择题 2:
常见的存储系统 IO 性能优化方式有哪些?
A. 尽可能多设计随机读写逻辑
B. 预读
C. 减少 IO 路径上的内存拷贝
D. batch 写入

解答:BCD

A成本太高

D:batch写入就是小的IO都会合并成大的IO落盘(合并batch),提升磁盘吞吐,不需要锁。

Day6

选择题

选择题 1:
关于 MD5 以下哪些说法是正确的?
A. MD5 可以用于加密密码
B. MD5 不可逆
C. 对于不同的输入, MD5 一定输出不一样的结果
D. 对于不同长度的输入,MD5 一定输出相同长度的结果

解答:BD

A:MD5不可逆,不可用于加密密码(其实在真实应用也可以使用,数据库存储md5加密串,用户输入密码md5与数据库数据比较)

C:MD5抗碰撞性强,对于不同输入结果一定不一样

D:MD5信息摘要算法,可以产生出一个128位(16字节)的散列值(hash value)

选择题 2:
关于红黑树以下说法正确的是?
A. 红黑树是平衡二叉树,任意两个子树的高度差不超过 1
B. 红黑树从一个节点到该节点的子孙节点的所有路径上包含相同数目的红色节点
C. 红黑树插入节点时最多经过 3 次旋转达到平衡
D. 红黑树进行插入操作时需要解决红红冲突

解答:CD

https://zhuanlan.zhihu.com/p/273829162

Day7

选择题

选择题 1:
在最好情况下,下列排序算法中,哪些排序算法所需比较的关键次数最少?
A. 冒泡
B. 归并
C. 快速
D. 直接插入

解:AD

由Day4选择题2可知冒泡和插入排序时间复杂度最好情况都为O(n)

选择题 2:
以下哪些是 Go 支持的指针运算?
A. 通过 & 取地址
B. 对指针进行自增
C. 下标运算
D. 通过 * 解引用

解:AD

Day8

选择题

选择题 1:
在 MTU=1500 字节的以太网中,TCP 报文的最大分段大小为多少字节?
A. 1440
B. 1460
C. 1420
D. 1480

解:B

1500-20(tcp报文首部)-20(ip报文首部)=1460

选择题 2:
关于经典的 Skiplist(原始论文实现)以下结论正确的是?
A. 每次的查找都从 head 节点的第 0 层(最底层)开始寻找
B. skiplist 的插入节点的层级都是固定的
C. skiplist 的元素都是有序的
D. skiplist 平均查询时间复杂度为 O(log n)

解:CD

A:每次都是从最顶层开始找

B:随机的

Day9

选择题

选择题1:

以下哪些排序算法是不稳定的?
A. 快速排序
B. 归并排序
C. 基数排序
D. 堆排序

解:AD

选择题2:

关于 Go 语言以下结论正确的是?
A. 在多核机器中,核数越多,使用多个 goroutines 写入 sync.Map 的性能越好
B. 只调用一次 rand.Seed,则之后 rand.Int 的生成序列是固定的
C. 放入 sync.Pool 中的结构体可能随时被回收
D. Goroutine 的栈不仅会增长而且还会缩容

解:BCD

你可能感兴趣的:(杂,java,网络,开发语言)