博主于2020.4月初投了字节跳动
上海创新业务
后端开发实习岗
(Java
方向),并且在2020.5初拿到了客户端
的实习offer,下面分享一下此次技术面试
的相关内容。
字节跳动上海创新业务(2021届实习生)三轮技术面总结
一、笔试(2020.4.12)
按各位前辈的说法,字节跳动
的内推一般是没有笔试
的,但是我还是有。。。最后发现原来我是直接在字节跳动官网投递,内推
是在字节跳动内推官网,我还是太年轻了。。。
笔试我现在只记得一道
题,总共有四道
题,当时AC
了三道。不过已经得了一个月,如果后面想起来了,再来补吧。
1、尽量使用优惠卷
题干:
给你一个优惠卷
数组、准备购买商品的价格
数组,并且规定每件商品
只能使用金额不大于自身价格的优惠卷(否则商场还得给你找零😂),优惠卷可以重复使用,但是一件商品只能使用一张优惠卷。现在要求你计算使用优惠卷后最小的总价
。
输入示例:
每个测试用例的第一行
是优惠卷的数量
,第二行
是各优惠卷金额
,第三行
是商品数量
,第四行
是各件商品的价格
。
3
1 2 3
4
2 4 1 5
思路分析:
水题一道
,显然每件商品应该寻找≤自身价格
最大的金额的优惠卷
。以我阅题无数
的道行
来看,这道题的关键是优化查找
,不能每件商品都去搜一遍优惠卷数组
,时间复杂度为O(m*n)
(m、n分别为优惠卷
、商品价格
数组的长度)。
我们首先对两个数组进行升序排列
,快速排序
、堆排序
、归并排序
随便撸一个,时间消耗O(nlogn + mlogm)
。然后使用两个指针,分别从优惠卷、商品价格数组头部开始扫描。
这要计算的理由比较简单,假设我们计算price[i]
用了某张最适合的优惠卷coupon[j]
,那么计算price[i + 1]
用的优惠卷的金额必然不会比coupon[j]
小,因此只要后移ptr1指针往后找即可。所以时间复杂度在O(m+n)
级别。
那么排序
+计算总价格
的时间复杂度在O(nlogn + mlogm + m + n)
级别。这道题测试数据还是比较多的,我最开始写的是希尔排序
,时间复杂度与步长有关,一般认为时间复杂度为O(n^(1.3—2))
级别,没有通过,后面修改为快排才AC。
2、其它不记得了。。。
二、第一轮面试(2020.4.21)
1、自我介绍下吧
姓甚名谁,籍贯啥的,就读于武汉理工大学 计算机科学与计算学院 计算机专业 本科
大一学了C++、Java
大二学了数据结构、算法,下学期在LeetCode上刷了半年的算法题
大三学了操作系统、数据库原理、计算机网络等专业核心课程
同时自己自学了Java web开发技术,SSM、SpringBoot框架,做了一个电商项目
看过分析MySQL、Redis、JVM实现原理的相关书籍
2、数据库中的事务了解么?有啥特性?
ACID,原子性、一致性、隔离性、持久性
可以特别提下一致性、隔离性的理解
3、MySQL数据库的隔离级别是什么?有几种?分别是什么?为什么要隔离?
如果多事务并发执行,不隔离,会产生问题
①、脏写。比如事务A将某条记录的属性修改为a,接着事务B修改为b,事务A再查看。
发现自己修改的内容被其他事务修改覆盖了。
②、脏读。事务A读到其它事务未提交的事务,比如事务B修改某条记录的属性为a,
事务A第一次查看是a,此时a是事务B未提交的内容
③、不可重复度。事务A读到其它事务的修改,比如事务A第一次某条记录属性的值为a,
事务B将其修改为b,然后提交了,此时事务A再去查看,发现变成b了,即不可重复度
④、幻读。事务A读到其它事务的数据插入、删除,比如事务A第一次select * from table while a = 'xxx',
假设数据库没有符合条件的记录,然后事务B插入一条满足a = 'xxx'条件的记录并提交事务,
事务A再次查看,发现突然又查到了。。。就像幻觉一下
注意:不可重复度侧重数据修改,幻读侧重数据插入、删除
四种隔离级别:
①读未提交。解决了脏写,存在脏读、不可重复读、幻读问题,同一条记录
不能同时被多个事务修改,行锁就行
②读已提交(不可重复度)。解决了脏写、脏读,存在不可重复读、幻读问题,
此级别独到的都是提交了的事务B构成的数据集
③可重复度。解决了脏写、脏读、不可重复读,存在幻读问题
④串行化。解决了脏写、脏读、不可重复读、幻读,所有事务一个一个排好队执行,没有并发问题,可是太慢了
4、熟悉MySQL的存储引擎吗?
熟悉innodb,了解一点myism
结构上区别,innodb中的主键(若没有主键,则使用表中的唯一字段,若唯一字段也没有,
自动生成一个唯一id字段标记每一条数据)使用了聚簇索引,索引即数据,数据即索引;
myism中的使用非聚簇索引,可以没有主键,数据单独保存在一个文件,索引是索引,数据、是数据;
功能上主要区别:innodb支持事务,myism不支持事务
如果只有查询,可用myism,有插入(特别是并发插入)一定要用innodb
5、什么是聚簇索引,联合索引?
MySQL中的索引分成主键索引、二级索引两大类,也可划分为聚簇索引和非聚簇索引两大类
主键索引(若没有主键,则使用表中的唯一字段,若唯一字段也没有,自动生成一个唯一id字段标记每一条数据),此索引是聚簇索引
二级索引根据非主键字段生成的索引
聚簇索引的特点是将所有数据复制到当前B+树的叶子节点,
一般的二级索引是根据索引字段排序,叶子节点只有索引字段值、主键值,
查完二级索引需要根据得到的主键值去查主键索引(聚簇索引),即要查两颗B+树
若某个二级索引是聚簇索引,则其叶子节点包含所有字段信息,查找即可得到所有需要的数据,
此时再去查找主键索引(聚簇索引),即只要查一棵B+树,但是聚簇索引需要浪费存储空间,因为要复制一遍数据
那么联合索引处于两种极端之间,根据多个字段建立索引,叶子节点含有建立索引的多字段、主键值,
这时就会产生一个问题,查完联合索引是否要去查主键索引?这时看你select的字段是啥,
如果聚合索引的索引字段包括了你要查的字段(索引覆盖),此时不需要去查主键索引,
否则你仍然要根据联合索引叶子节点的主键值查主键索引,因此当你查找sql使用联合索引,尽量将
需要查找的字段设置为联合索引中的值(索引覆盖),可以减少查主键索引
6、select * frow table where 字段a < A and 字段b > B,假设它使用了联合索引<a, b>,大致查找过程什么?
联合索引对应的B+树根据a、b升序排列,存储引擎访问联合索引B+树,筛选字段a < A的记录
对应的主键值集合,筛选字段b > B的记录对应的主键值集合,然后取交集。不过也可能直接遍历
一一判断是否同时符合字段a < A and 字段b > B两个条件。
使用联合索引,需要考虑是否会发生索引覆盖,由于select * 所有字段,
一般的联合索引得到主键值集合,再去查找主键索引得到所有字段
7、MySQL执行sql的主要流程?
MySQL是基于C/S模式开发的数据库管理系统,客户端把sql传给服务器,服务器先要验证身份,
服务器得到sql,先查服务器中的缓存,查到了直接返回,然后对sql进行词法、语法、语义分析,
再接着进行sql优化,交给sql执行器,最终给到存储引擎,存储引擎查到数据返回给客户端。
(数据库这块,中间被面试官打断了两次,说深度可以了可以了。。。可我硬是给扯完了😂😂😂)
8、Redis字符串是如何存放的?
Redis自定义了sds数据结构用于存放字符串,该结构主要有len,buf(C格式的字符数组)、
capacity是buf字符数组的长度。由于该结构使用属性len来记录字符串的长度,所以是二