首页 > 字节跳动 -- 杭州教育部门 -- 123面 -- 已通过
头像
Muche
编辑于 2020-07-29 09:59
+ 关注

字节跳动 -- 杭州教育部门 -- 123面 -- 已通过

一面 (7.15 46min)

数据库

项目中自己最大的困难,如何解决的

聊千万级别的数据表格优化

项目收获 --- 问到自己数据库存的什么数据

PLC上位机,存各种通道数据

索引类型 - 刚提到索引,那具体有哪些索引类型了

单列、多列(复合索引)、覆盖、前缀索引,聚集、非聚集

多列索引实现原理

B+树,然后回答了B+具体的实现原理,相比B树区别

二叉树和哈希适不适合做索引

  1. 二叉树这里主要用红黑树,AVL因为旋转次数较多,一般不用。但两者都不适合索引,因为深度太大,查询慢
  2. 哈希索引是有做索引的,根据哈希值确认对应位置,访问速度快,但不适合范围查询。在InnoDB中有将热点数据建立自适应哈希

数据提交了会不会丢失 -- 引出事务,和事务恢复过程

我先抛出事务提交不会丢失数据,然后分析事务恢复过程。
说恢复的时候,先以一个更新语句为例。会经过两层,SQL上层和存储层。然后具体讲了binlog,undo log,redo log 如何完成的过程

undo log作用

原子性和MVCC

undo Log等日志会不会丢失

有可能,先写入到缓存。具体讲了undo log写入到 redo log日志中,redo log写入缓存,最后才刷新到磁盘。
提升了IO性能

最左原则 -- 给了一个题

最开始说不大了解,还是给了一个题,下列索引能不能共用。
我说1 2肯定是可以,因为顺序是一致的。4由于顺序不一致因此不对。
3我不能确定

面试官给出了补充
顺序没有太大关系,MySQL会自己优化,但3和4都不行

补充
后面和同学聊了下,这里复合索引会有顺序要求。从左边那列必须存在。比如 col1 col2 col3 。 那么当只涉及到col2 col3的时候,索引就失效了。 另外像底下题目,当a >= x 那么会使用a的所有,但b的索引就阻断了

(a,b)
1. a=x and b =y
2. a=z
3. a>=x and b=y
4. b>=x and a=y

mysql 联合索引生效的条件、索引失效的条件

操作系统

进程间的通信方式

6种,后面说还一种,不知道

那种通信方式最快

我回答的共享内存

现代计算机多核CPU下,如何保证数据一致性,或者说如何工作的

三级缓存,缓存行,缓存锁

在一个读多写少的情况下,如何设计让性能提升

我说的使用双缓存,一份用来读,另外一份用来写,然后再交换数据指针。并拷贝一份新的(类似copy on write)

对某个数据的读写能否保证数据原子性

我以java为例,基本数据可以,非基本数据会有问题,因为超过一个缓存行的长度,那可能分两次读写

网络

time-wait状态知道吗,为什么要有time-wait

四次挥手的2MSL,说了两个原因,

  1. 服务器:如果发送FIN+ACK没有收到C的回复,则会再发送一次,因此C的2MSL为了避免S的重传
  2. C发送完最后一个请求,2MSL时间可以等待本阶段产生的所有报文段从网络中消失,不在新的响应中出现

服务器端可不可能出现大量处于time-wait状态

一开始没说出来,提示了下,比如nginx反向代理,然后我就分析了一通

nginx了解吗,反向代理的时候,如何保证负载均衡

这个其实大致知道的,假装想了会,说了轮询、加权轮询,随机,最少连接,加权最少连接,IP哈希保证会话一致性。

刚说到哈希负载均衡,那如果新加入节点,如何保证会话仍然落到同一个节点

开始说了说取消服务器的状态,统一服务器管理session。
后面面试官说如果节点就是有状态的,怎么解决。
想了半天不知道,面试官说用一致性哈希,让我了解下

算法

判断一个树是否二叉搜索树

中序遍历即可。我写的 pre节点用Integer.MAX_VALUE。说不大好,不直观,我想了想,用节点,先给null值。

二面(7.22 50min)

聊项目

详细说明业务场景,索引建立在哪一列,查询语句是什么

这里自己其实有一点没有太明白,SQL Sever的最左原则是否适用,需要查一下

点赞点踩介绍

介绍了点赞点赞逻辑,和一个异步过程。
这里被面试官指出:当前的方式和缓存时相悖的,应该sql存数据,redis缓存,这样才能提高访问速度。

基础

redis和mysql哪个更快,为什么

主要内存和外存的磁盘IO读写区别

虚拟内存是怎样的

内存空间不足,价格昂贵,虚拟内存提供进程一个抽象的私有的连续逻辑内存地址
从作用,然后覆盖,交换降到虚拟内存

虚拟内存和物理内存如何管理的

页表映射

页面置换算法

FIFO,LRU,第二次机会,时钟轮转

HTTP和HTTPS区别

加密 + 认证 + 完整性保护

  1. 默认端口:80/443
  2. HTTP不安全、HTTPS在SSL/TLS之上,对称和非对称加密,安全
  3. HTTP + 加密 + 认证 + 完整性保护 = HTPPS
  4. 混合加密:S给C一个公钥,C利用公钥加密对称加密共享秘钥,S利用自己的私钥解开共享秘钥。最后使用共享秘钥加密进行通信

CA认证具体过程,如何保证正确性

服务端申请证书,和客户端去CA请求证书是否正常的一个过程

算法题:LeetCode 41 缺失的最小正数

反问

三面(7.28 55min)

项目

前面聊了很多项目方面的吧,谈谈你对前面面试的感受

面试是一个学习与提高的过程,一面的时候最左原则不是很懂,学习了下,在自己项目里也对应修改了下,效果的确要好一些;

二面提到的redis和mysql的运用,自己重新理了下逻辑,将项目修改为一个异步过程。balabala

之前谈的第一个项目,那来聊聊第二个项目

这里说了下大概场景,和自己的优化,后面聊到订阅者模式和pull方式获取数据,这个就不详细说了。

基础

虚拟内存二面问到了,那你说说虚拟内存置换算法

这个二面其实也问到了。前面没有回答OPT,这次加上了

前面有问到网络吗,那你说下一个网址输入到到服务器会经过哪些地方

我确认了下问题,不大需要回答具体哪个协议的过程。从本地计算机,不知道自己网关路由器时就ARP获取MAC地址,然后到达路由器,路由器根据路由选择协议,不断选择下一跳,在生存时间内到达对方服务器,那么将获得对应响应

刚说到路由器到下一跳,那么如何确定下一跳位置呢?

自己从系统内路由选择协议和系统外路由选择简单回答了下。

问一下MAC相关的,MAC数据哪一层结构

数据链路层

那MAC地址是如何确认一台设备的呢

前24位厂商,后24位计数编号

MAC地址可不可以相同,相同会有什么影响

mac地址可以修改网络地址,但本机硬件不可以,相同的话会造成同一个局域网两台设备冲突。

那比如我两现在的MAC地址一样,能传输到我这边来吗?

我猜测可以,从链路层每次都会修改对应的下一跳MAC地址,当时跟面试官说这是我猜的,他笑了笑。就开始其他的了

算法概率题

概率题-- A, B两个人,轮流抛硬币, 谁先抛出正面谁就赢,A先抛,求A赢的概率?

因为输的概率是1/4+1/4 * 1/4+1/4 * 1/4 * 1/4+.....+1/4的n次方,极限值为1/3,所以赢的概率是2/3。

这样的话是不公平的,那如何公平呢?

抛一次,正的A赢,反的B赢

那假设都要抛了

两次,正正,正反 A赢, 反正,反反B赢

算法题 -- 剑指offer 3改编

int 数组, size N, 元素范围 0~ N-1, 求存在重复的元素。
要求: 时间O(N), 空间O(1)

一开始只想着求一个元素,将数组都加个1,则范围变为 1 - N,则可以变成一个链表求环的入口问题,说了半天,面试官没听太懂,让我先写,我写到一半,面试官说这是只找一个嘛,要找多个怎么办。
又想了好一会,跟面试官说了另外一种思路,后面面试官提示了下,改成另外一种方案了,代码如下。

class FindRepeatNum{
    public Set<Integer> findRepeat(int[] nums){
        int n = nums.length;
        Set<Integer> res = new HashSet<>();
        if(n == 0) return res;
        for(int i = 0; i <n; i++){
            int idx = nums[i] % n;
            nums[idx] += n;
            if(nums[idx] / n >= 2) res.add(idx);
        }        
        return res;        
    }
}

更新:上述代码有个问题,应该是nums[i] % n,之前写的是nums[i % n],这个是有问题的,感谢“我非真心”小伙伴私信提醒。
补充个示例:
第一行是下标,第二行是数组数据,第三行是遍历一遍的数据
0 1 2 3
1 0 2 2
4 3 8 2
这里遍历到下标3的时候,下标2对应的数字变为8,对应出现两次,即可找到答案。相应的如果有多个数据,那么也是一样的逻辑

自学过程有看那些书

反问环节

小结

相比于很多人流程快速,我算是比较慢的,可能教育投的人也多,自己投的也不早。不过整体算比较顺利,面试官也都很有耐心。

总体而言,一面相对来说问的最深最广,可能也是自己操作系统这块比较薄弱。二面项目问的最深,光项目就问了二十多分钟,也给了我很多启发。三面从一个新的维度问了一些项目问题;算法题上,面试开始时说这场面试40-45分钟,算法题留了十分钟给我做,当时想得有点紧张,面试官很有耐心的引导了,虽然做出来了。最后也不知道能不能通过,但反问环节给了一个比较重要的点:在接下来一年的可以补一下科班学的那些课程,包括编译原理、离散数学等,这样入职后会有不一样新的认识。对于技术栈,MQ也多了解些。

前面也面了些公司,字节算是已经面完整的第一家公司。不管怎样,面试也是一个提高过程,感觉自己语言表达和具体技术深度的确都有一定的提升。前面看了很多小伙伴们分享的面经,这篇简易的面经就当做一个记录和分享。

最后,许愿通过!


更新:牛客许愿很灵哇,刚发完没多久,hr发消息说三面已通过。

更多模拟面试

全部评论

(23) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐