字节跳动上海创新业务(2021届实习岗)三轮技术面总结

博主分享了字节跳动2021届实习岗的技术面试经历,包括笔试和三轮面试的详细内容。重点讨论了数据库、计算机网络、数据结构、操作系统和Java并发等技术问题,强调算法、数据结构和问题解决能力的重要性。
摘要由CSDN通过智能技术生成

  博主于2020.4月初投了字节跳动 上海创新业务 后端开发实习岗Java方向),并且在2020.5初拿到了客户端的实习offer,下面分享一下此次技术面试的相关内容。

一、笔试(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来记录字符串的长度,所以是二
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值