一月一日收到字节跳动算法实习生的面试通知,约到一月三日下午四点十五分。特意把三号下午空出来,看看了前辈们的面经。下午面试开始,两个面试老师都非常好,非常赞。一面聊了十几分钟项目,然后两个手撕算法,一个贪心,一个是普通的算法题,随后等了三四分钟,二面就开始了,二面也是先聊了一会项目,然后是两个算法,一个是动态规划,一个是搜二叉搜索树,接着问了一些机器学习基础。
一面流程
自我介绍
先做了个简单的自我介绍,有简单的准备,所以比较流畅,轻松。
项目经验
问了一些项目的问题,已经参加过得比赛,已经比赛的任务,流程,分工,合作。还有大创项目相关的问题。
手撕算法
第一道
输入一个大于0的Arr列表,一个大于0的target,求X,X的要求为:min{x.size() | sum(x) = target && x为arr元素的子集}
例如:arr = [1, 2, 2, 4, 6, 7, 8], target = 13 解为:1 + 4 + 8 = 13,6 + 7 = 13,return 2
我的思路:
- 类似与贪心算法,先从小到大排序。
- 从后开始往前遍历,arr[-1] 开始。
- 若 arr[-1] > target,则移动直 arr[-2],一直类推;
- 若 arr[-1] = target ,则 return 1;
- 若 arr[-1] < target,则观察 arr[-1] + arr[-2] < target,成立,继续加前面的,若不成立,则 arr[-1] + arr[-3] < target,以此类推到 arr[0] ,记累加的个数,换 arr[-2]。
- 若前一个累加值比目前的小,则更新。
第一道
输入一个Arr列表,求比Arr大的最小的Arr_new自然数组合
我的思路(不一定对):
- 刚拿到这道题有点蒙,但是在面试官的引导下,还是理解了题的大意,并且指出例子中的输出是错误的。
- 这个题也有点贪心的思想在。
- 首先,我们可以理解Arr_new[0]一定和Arr[0]一样,来保证其是大于Arr的最小。
- 第二步,Arr_new[1]一定是大于等于Arr[1],才能保证其可能大于Arr[1],但是我们尽可能找 Arr_new[1] > Arr[1] 同时 Arr_new[1] - Arr[1] 最小
- 以此类推
结束后,面试官说让我准备一下十分钟后二面。我当时都震惊了。
二面流程
自我介绍
和一面一样
项目经验
侧重问方法
数学问题
工厂流水线的每天生产手机需要被检验是否合格,做一个方案使得概率相等
我的思路:
- random一下就行,面试官说假如多少个手机不知道怎么random
- 瞬间懵。一秒。两秒。三秒。
- 后面想到做一个容器,流水线判断进入容量为n的容器,容器满则随机抽走1/n
- 面试官让我求概率
- 最后得出的结论是:(1/n)*(n/N) = 1/N
手撕算法
第一道
在二叉搜索树找一个离值X最近的一个值
我的思路:
坑居多,但是老师很耐心,一步步引导
第二道(动态规划)
最小编辑距离(字符串A到字符串B变化最少要多少步)
设A 和B 是2 个字符串。要用最少的字符操作将字符串A 转换为字符串B。
这里所说的字符操作包括
(1)删除一个字符;
(2)插入一个字符;
(3)将一个字符改为另一个字符。
将字符串A变换为字符串B 所用的最少字符操作次数也称为字符串A到B 的编辑距离,记为 d(A,B)。
试设计一个有效算法,对任给的2 个字符串A和B,计算出它们的编辑距离d(A,B)。
我的思路:
这里给出最优子结构,自己体会,博主已奔溃
D[i][j]=min(min(D[i-1][j]+1,D[i][j-1]+1),(A[j-1]==B[i-1]?D[i-1][j-1]:D[i-1][j-1]+1));
基础知识
- 交叉熵是什么,默写公式
- 机器学习中的损失函数有哪些,损失函数的作用
- 类别不平衡解决方案,默写Focal Loss公式,和原理
- L1,L2正则化区别,有什么作用,公式简述
- 稀疏矩阵是什么
- SVM优化方法
面试总结
- 人生的第一次面试献给了字节跳动
- 面试的老师真的好,很耐心,不会的时候等你,敲不出来代码也不催你,让你慢慢打;不会的问题会一步步地引导你。
- 感觉投错了岗,想投cv的岗结果跑到机器学习那边去。机器学习会的不多,虽然都答上来了,还是对自己机器学习的基础不满意
- 手撕代码真地菜,两个题写了半个小时。
- 算法基础很重要