字节跳动 算法面经整理

自我介绍

项目介绍

  1. 之前别人是怎么做的。
  2. 别人做的不足。
  3. 你做的和别人做的有什么差别。(这里重点讲一下自己的创新点。)
  4. 你达到了一个怎么样的精度,效果如何。
  • 介绍一下当今在你的领域的state-of-the-art

  • 印象最深的paper和最近看过的paper

  • 项目中遇到的最大的问题是什么

  • 你觉得影响模型效果的因素有什么,并排个序。(我回答的是特征>模型>优化器,

  • 实验室的研究方向有哪些

  • 用什么数据集

  • 数据集小的时候该注意什么问题(过拟合)?

  • 模型欠拟合的时候怎么处理?

  • 当模型的性能不好时,如何分析模型的瓶颈?

  • 有哪些评价指标。 (roc, auc, f1-score)

  • 说一下项目的分工?

  • 看过哪些开源项目

  • 看过哪些开源框架的源码?看过tensorflow源码没?

  • 算法里有什么改进的地方吗?

  • 训练怎么监督的,损失函数是啥,你认为深度学习在其中学到了什么?

  • 介绍下你的技术栈情况,像操作系统,数据结构之类的

技术面问题

  • 你都熟悉哪些常用的机器学习算法?
    答:回归算法有:线性回归、Lasso回归、岭回归。分类算法有:逻辑回归、决策树、贝叶斯、SVM、神经网络、集成学习。聚类算法有:k-means、层次聚类

  • 你能详细的讲解一下,线性回归的原理么?你讲解的线性回归是我们理解的形式,你能具体讲解一下线性回归的底层原理,比若说如何训练,如何得到参数,如何调整参数等?

  • 你再详细的讲解一下朴素贝叶斯的底层原理,比如说,如何选参数,如何训练模型,如何做分类?

  • 过拟合的解决方法
    答:三种解决办法:
    (1)修改激活函数。
    (2)用BN。
    (3)把传统的循环神经网络,换成GRU网络。

  • 数据结构中,什么是平衡二叉树?什么是二叉树?平衡二叉树的应用都有哪些?

  • 让详细介绍一下逻辑回归,包括逻辑回归的分类公式,损失函数、逻辑回归分类的过程。

  • 问了一下逻辑回归中损失函数的作用?逻辑回归中除了损失函数能衡量模型的好坏,还有没有其他的方法?

  • 什么是self-attention,什么情况下要用,K、Q、V分别是啥

  • 随机森林和决策树怎么操作

  • 线性回归和逻辑回归的区别和联系,从广义线性模型角度考虑。优化方面?

  • 给你M个正样本,N个负样本,以及他们的预测值P,求AUC。(写完之后接问:AUC究竟在衡量模型什么能力?如果现在所有预测值都*1.2,AUC是否会变化?)

  • Attention,考虑到最近Attention的火爆和字节跳动的主要技术优势,attention这一个技术热点是一定要复习的(然而我没仔细看,非常后悔,面完之后从头到尾看了一遍)。

  • BatchNorm这一个问题其实我有用过,我也知道原理,但是当面试问具体公示的时候,还是愣了一下,但是BN无疑是一个很火的应用,必须要会。其他的例如softmax与cross entropy的推导,过拟合与正则化,BiLSTM,Gradient Explosion,Top N,特征选择都是常规问题就不仔细说了。

  • SVM原理,为什么使用对偶,凸集的定义,凸函数定义等等一些最优化方法的问题,SVM中SMO具体的操作以及原理。

  • python,说一下有序map和无序map的区别以及底层实现,你知道智能指针底层怎么实现的吗?

  • 问了xgboost并且手推,GBDT和XGBOOST的区别,random forest,GDBT,XGB,LGB之间的区别和联系

  • 正则化相关

  • lr手推,xgboost手推等

  • 手推LSTM的梯度反向传播

  • sigmoid和softmax的区别,sigmoid判别阈值如何选?

  • C++面向对象介绍下,new 和malloc有什么区别

  • 实现求auc的过程(输入就是instance的score和对应label)

  • 矩阵分解相关知识

  • L1正则化和L2正则化的区别

  • stacking/boosting/bagging的区别

  • 常用的优化算法有哪些?各自的优缺点?有了解哪些优化方法。(讲了SGD, 到一阶动量、二阶动量,adam,nadam, 以及adam不收敛的问题等等)

  • 你了解元学习吗?说一下你的理解。

  • 权值初始化方式对LR的收敛有影响吗?

  • 你对权值初始化有什么了解?怎样才算是好的初始化?

  • 说说Adam等优化器的区别(从Momentum到RMSprop到Adam以及Adam可能不会收敛,还说了NAG和AdaGrad),adam的默认参数有哪些

  • 对于LR来说,LR如果多了一维冗余特征,其权重和AUC会怎样变化(权重变为1/2, AUC不会变化)

  • 写出LR的损失函数(交叉熵损失函数)

  • Sigmoid,Tanh,Relu等激活函数的优缺点(这里之前没有复习到,后面想了想应该从梯度消失,数据压缩,0均值方面来解释;当然,说的越多越好,比如Relu的神经元dead啥的,越能体现你的知识广度)

  • DL基础(正则化,数据不平衡,negative sampling)

  • LR,FFM,DEEPFM之间的区别和联系

  • GDBT的基模型是什么,对应的损失函数是什么,怎么分裂的节点

  • 神经网络中网络权重W初始化为0有什么问题?

  • 绍GAN中的生成器和判别器

  • 介绍层次Softmax

  • 介绍Batch Norm,Layer Norm

  • EM算法

  • 了解模型蒸馏吗

  • 【知道的分类算法有哪些?】稀疏贝叶斯是什么样的算法?这个算法有什么样的应用领域?分类算法中哪些是线性的?【决策树是不是线性的?】

  • 知道图像里面的插值算法有哪些?(三次样条和线性插值)学过图像处理的课程吗?用过什么图像的库函数?

  • 有上过神经网络的课程吗,是自学的吗?了解感受野吗?怎么计算感受野?怎么增加感受野?(增加感受野和网络深度,压缩图像尺寸)

  • 介绍方向导数和梯度,方向导数和梯度的关系?为什么梯度在机器学习中的优化方法中有效?
    梯度是向量,方向导数是数量。梯度是各个偏导数组成的一个向量,方向导数是各个偏导数与方向余弦相乘再求和。梯度这个方向的方向导数是最大的。

  • 决策树的分裂方式是什么,根据什么变量来决定分裂变量

  • 解释一下过拟合和欠拟合,怎么发现过拟合问题,怎么解决过拟合

  • 你说到正则化问题,正则化有哪几种方式

  • 正则化这两种方式的区别和公式分别是什么

  • 你说l1会使得特征系数稀疏化,为什么呢(岭回归和lasso回归的区别)

  • 你说到lasso回归有特征选择的作用,有哪些特征选择的方式

  • 有哪些常用的降维方式

  • 过拟合的解决办法

  • SVM的推导。还问了SVM如果不用对偶怎么做(这个没答上来)

  • python dict 怎么实现的

  • 样本不均衡怎么解决,我说人为对采样少的样本重复几次 然后他问这样auc会不会变并解释 我说不会变,解释的不太清楚但他好像听懂了(我也不知道他怎么听懂的)

  • 有哪些激活函数,各自有什么优点,具体做模型的时候怎么选 那无非就是0均值 梯度消失梯度爆炸 可导啥的

  • lstm原理解释,每个门用什么激活函数,我真有点忘了说遗忘门是sigmoid 输入输出是tanh 他说没有问题 我也不知道是不是真的没有问题

  • 不平衡应该怎么做?

  • GBDT可以并行吗?

  • ResNet的结构特点以及解决的问题是什么?

  • 反卷积相比其他上采样层(pixelshuffle)的缺点,棋盘格现象怎么产生的

  • LSTM与RNN的区别

  • 梯度消失/爆炸产生原因

  • 梯度消失解决方法

  • 梯度爆炸解决方法

  • 集成学习了解吗

  • CNN中感受野/权值共享

  • Resnet理解

  • Resnet相比全连接什么区别

  • Alexnet/VGG/Densenet/Googlenet

  • 什么是梯度消失/爆炸

  • RNN/LSTM解释

  • LSTM怎么缓解梯度消失/Resnet怎么缓解梯度消失

  • 有什么方法能解决梯度消失

-线程与进程

  • 锁/悲观锁乐观锁

  • CNN中怎么做的卷积/卷积的优势/卷积之后接什么层/为什么做pooling/都有哪些pooling

  • 卷积层/Pooling层(mean/max)的反向传播

  • 卷积层参数量计算

  • 说一下自编码这个网络结构

  • 图像分类一般用什么损失函数?(回答交叉熵)那说一下交叉熵的形式吧?可以写下来,讲一讲怎么来的?举了逻辑回归中的交叉熵损失,然后讲了公式变换以及对数似然等;

  • 如果数据集有20%的噪声数据,会有什么影响?可以按照上面写的损失函数来想?

  • 对图像分类网络的发展历程和进展有了解过吗?比如resnet, inception这些。

  • ResNet V1到V2的改进有了解吗?

  • 那ResNet的下采样过程是怎么样的?

  • 卷积操作的参数怎么计算?参数量呢?

  • 强化学习相关: 具体讲讲DDPG,为什么不用DQN等其他的方法?
    3、讲讲policy gradient的发展史
    4、基于策略的方法的优化目标
    5、基于值的方法的优化目标
    6、为什么采用GRU不采用LSTM,他们有什么区别?
    7、为什么LSTM会优于传统的RNN?
    8、LSTM怎么解决梯度消失?不同门的作用

  • python的动态数组是如何实现的,

  • FM 与 LR对比一下

  • softmax 与 二分类 比有什么特点。

  • xgb与LR各自的优缺点

  • LR为什么更容易并行

  • adam公式写一下(同时介绍了adam是momentum和RMSprop的结合)

  • 为什么 adagrad 简单求和不好?

  • GMM介绍一下,损失函数写一下

  • 进程线程的区别?进程和线程相比有什么好处?

  • 问了一道c++的常量引用传参出现的问题

  • 2.5亿个整数找不重复的整数,内存无法一下存下这2.5亿个数,怎么做。

  • 如何判断机器是大端模式还是小端模式

  • 哈希表了解吗?有哪些解决冲突方法?

  • CART了解吗?怎么做回归和分类的?

  • 堆空间栈空间了解吗?

  • 释下raw图像和rgb图像的区别

  • 了解其他色彩空间格式嘛?饱和度、亮度这些了解嘛

  • huber函数了解吗?和l1、l2比起来优势是啥?

  • 机器学习中一般怎么衡量模型效果?auc值怎么理解?

  • 怎么衡量两个分布的差异?KL散度和交叉熵损失有什么不同?关系是啥?

  • 怎么理解最大似然估计?

  • 说下红黑树叭,怎么插入的?简单一点的,比如AVL树呢?

  • python的GIL

  • python里的多线程,怎么让它占满核呢?

  • c++的虚函数和虚继承

  • 逻辑斯蒂回归里面,输出的那个0-1之间的值,是概率值吗?你看它又叫对数几率回归,怎么理解几率这个概念?

  • 比较下随机森林和GBDT

  • 随机森林的随机怎么理解?

  • 批量归一化的思想,还了解其他归一化吗?

  • 说下平时用到的深度学习的trick

  • 说下adam的思想

  • 其他GAN

  • 怎么让GAN更稳定更好

  • 通常GAN有不收敛、模式崩溃的问题。
    不收敛的原因分析:在最优解附近震荡,需要约束梯度。
    让GAN稳定的trick:
    1.WGAN的地球移动距离衡量数据分布差异
    2.零中心梯度惩罚。权重的L2正则化
    3.权重平滑移动(EMA)。

  • 均衡学习率。权重归一化。

  • 模式崩溃:用批数据标准差来衡量数据多样性,在判别器最后一次添加。

  • logit函数和sigmoid函数的关系

  • 交叉熵损失

  • 介绍策略梯度

  • 卷积核大小如何选取

  • 为什么卷积神经网络适用于图像和视频,还能用于其他领域吗?

  • 做视频用的何种评价标准?

数学题

  • 从概率角度,5局3胜和3局2胜,哪个胜算更大?

  • 一个骰子掷出1后停止,问骰子投掷次数的期望
    E = 1/6 * 1 + 5/6 (E+1)
    E = 6

  • 一个骰子连续掷出三个同样的数字如“3,3,3”、“4,4,4”后停止,问骰子投掷次数的期望。
    E = 1/6*(1/6 * 3 + 5/6(E+2)) + 5/6 (E+1)
    E = 18

  • 一个概率问题,每个人投票给a概率51%,每个人投票给b概率49%,问投票人数和a最终获得更多票数之间的关系

  • 1-2000内互质的数最多有多少个

  • A、B两人投硬币,谁先投到正面谁就赢,求先投的人赢的概率

  • 在一片草原上有1只羊和若干只狼,狼可以吃羊或不吃羊,但狼吃羊后会变成羊,从而被其它狼吃掉,已知羊不能被两只或以上的狼分着吃掉,并且每一只狼都会先保证自己不被吃掉,而在此前提下每一只狼又都想吃到羊,那么羊是否会被吃掉?

  • 飞机上有100个座位,有100个乘客准备登机,每个乘客按顺序上飞机,但是第一个乘客喝醉了,随机挑了一个座位来坐。每个乘客的选座位规则:1)如果自己的座位没被坐,则坐自己的位置;2)如果自己的座位被坐了,则从剩下的座位中随机选一个来坐。则第100个人能做到自己座位的概率是?

  • y=\sqrt{x^{2}}的可导性。
    先化简为绝对值函数。定义域为R。可导要求左导数、右导数存在且相等,所以函数在x等于0处不可导,其余处可导。

  • 调和级数的敛散性。

  • 人群中男人色盲的概率为5%,女人为0.25%。从男女人数相等的人群中随机选一人,恰好是色盲。求此人是男人的概率。
    全概率公式一般不会考。面试或者笔试这种一定是考贝叶斯公式。这种题把事件用变量定义好就简单了,分清哪个是条件概率。
    设“一个人是男人”是事件A,事件A非为“一个人是女人”。“一个人患色盲”为事件B。需要求的是逆概率P(A|B)。面试官后面问我贝叶斯公式在机器学习里有哪些应用,我只说出了垃圾邮件识别。

  • 在网游中,野怪被杀死时,有p=0.2的概率掉落一把宝剑。野怪的死亡是独立事件。玩家持续杀死了10个野怪,求掉落4把宝剑的概率。
    独立重复试验,二项分布。C(10,4)*(p4)*((1-p)6)。

  • 十个红球十个白球,无放回抽出10个然后红球互不相邻的可能性。没想好,不过具体思想就是一红一白相间地摆好先,然后再在白球红球之间插入白球,面试官说时间关系就先这样了,但是很接近了。

  • 一道面试官说挺难的概率题,想半天没做出来。
    抽R的概率2/3
    抽到S的概率1/3
    连抽RRR后必抽S
    问抽n次后,E(S)
    10个人里每个人在10分钟内的任何一个分钟到达的概率是均匀分布的,问所有人都到达的时刻在几分钟时概率最大。
    现在有一堆点,求一个点到每个点的距离之和最小,证明这个点是质心。

扔n次骰子,取其中最大的点数作为它的最终点数,乙扔一次骰子得到点数,求乙的点数大于甲的概率。
某种病的发病率为1/100,某种检测该病的技术检测正确率为99/100,现有一人被检测到生病的概率为p,求他真实生病的概率是多少?
在上一问的基础上,现在连续两次检测为有病才会停止检测,求检测次数的期望值。

HR面问题

  • 你为什么选择我们公司

  • 你将来的职业发展规划

  • 优缺点,过往经历,还投了哪些公司之类的

  • 对前两轮自己面试表现的评价?

  • 为什么要选择实习?职业规划

  • 介绍一下你看过的电影?

  • 你有什么要问我的?

  • 闲聊,读过什么论文 平时喜欢看什么书 周末喜欢干什么

  • 爱好等个人问题 城市选择 部门选择理由 期望薪资 入职时间

  • 你怎么看待AI落地在企业中的比重

  • 你职业规划怎么样的?更偏向工程还是算法呢?

灵魂十问

  • 你最大的优点和缺点
  • 你是否接受加班?
  • 你对薪资有什么要求吗?
  • 在五年的时间内,你的职业规划?
  • 我们为什么要聘用你?
  • 你对于我们公司了解多少?
  • 你为什么愿意到我们公司?
  • 与上级意见不一致,如何处理?
  • 你缺乏工作经验,如何能胜任这份工作?
  • 工作中与同事发生争执,你会怎么处理?

面试编程题

  • 给定一个单链表的头节点 head,实现一个调整单链表的函数,使得每K个节点之间为一组进行逆序,并且从链表的尾部开始组起,头部剩余节点数量不够一组的不需要逆序。(不能使用队列或者栈作为辅助)
    例如:
    链表:1->2->3->4->5->6->7->8->null, K = 3。那么 6->7->8,3->4->5,1->2各位一组。调整后:1->2->5->4->3->8->7->6->null。其中 1,2不调整,因为不够一组。

  • 长度为n的数组中,总是存在一个断点(下标记为i),数组中断点前面的数字是有序的,断点后的数字也是有序的,且断点后边的数字总是小于前面的数字。如果直接把断点后边的数字移动到数组的前边,那么这个数组将是有序的,具体描述如下所示。求这个数组中的第n/2大的数。
    原数组:
    6,8,10,13,1,2,4
    找到断点移动之后的数组:
    1,2,4,6,8,10
    #############################
    原数组:
    5,1,2,3,4,
    找到断点移动之后的数组:
    1,2,3,4,5
    ##############################
    原数组:
    2,3,4,5,1
    找到断点移动之后的数组:
    1,2,3,4,5

  • 给你一个很大的文件,文件里有很多行数据,每一行数据是一个用户的uid,表示这个用户点开过抖音,请你找出打开抖音次数最频繁的前10个用户。

  • 给定n个结点,m条有向边(n<=100)。每个结点代表一个抖音用户,每条边A->B代表A关注了B。关注具有传递性,即若A关注了B且B关注了C,那么等同于A关注了C。 然后定义“抖音红人”的概念:若一个用户被其它n-1个用户关注,那么他是抖音红人。现给定这样一个关注网络,返回所有的“抖音红人”列表。

题解:DP+dfs(记忆化搜索)。对于某个用户A,若要求关注A的的用户个数,则需要累加所有指向A的用户的被关注数。然后递归地(dfs)求所有指向A的用户Bi,也要累加所有指向Bi的用户的被关注数。。 有两个关键点:1.需要用记忆化搜索保存中间过程,对于已求过的结点,不能重复递归计算;2.累加不是单纯的加和,而是要对每个结点维护一个集合set,累加的操作其实是求并集操作,防止同一用户被累加多次。

  • 描述KMeans算法,并用Tensorflow写代码实现。

  • Tensorflow写一个KNN算法,KNN算法是否可微

  • 用C++写个简单的矩阵乘法吧,矩阵乘法怎么优化,两个上三角矩阵相乘如何优化

  • 找到输入数组a中最短的子数组,使子数组的和大于n,输出这个子数组的长度。
    时间要求O(n)

  • 在一个整数数组中,找到第一个缺失的正整数。
    时间要求O(n),空间要求O(1)

  • 把输入的汉字转化成int整数。
    测试样例:两百三十二、两万零三十亿九千万

  • 给定一个只包括 ‘(’,’)'的字符串,判断字符串是否有效。注:空字符串属于有效字符串

另外参考:
github 面试算法题
作者:sam3125C
链接:https://www.nowcoder.com/discuss/377141
来源:牛客网

LeetCode 001. Two Sum
LeetCode 015. 3Sum (可能会问 LeetCode 18. 4Sum 思路)
LeetCode 020. Valid Parentheses
LeetCode 021. Merge Two Sorted Lists
LeetCode 025. Reverse Nodes in k-Group
leetcode 42
LeetCode 053. Maximum Subarray
LeetCode 066. Plus One(等价于:高精度加法)
LeetCode 76. Minimum Window Substring. Hard
LeetCode 098. Validate Binary Search Tree
LeetCode 110. Balanced Binary Tree
LeetCode 134. Gas Station
LeetCode 136. Single Number
LeetCode 137. Single Number II
LeetCode 146. LRU Cache(变形题:带有过期时间的 LRU 缓存)
LeetCode 206. Reverse Linked List
LeetCode 215. Kth Largest Element in an Array(等价于:快速排序)
编程题(LeetCode-224,hard,简化版,不包含括号):实现一个基本的计算器来计算一个简单的表达式字符串。表达式字符串只包含非负整数、+, -, *, /操作符。您可以假设给定的表达式总是有效的。
LeetCode 232. Implement Queue using Stacks
lc原题284
LeetCode 328. Odd Even Linked List
leetcode329
LeetCode 415. Add Strings(等价于:大数加法)
LeetCode 470:rand7() rand10()
LeetCode 496. Next Greater Element I(时间复杂度O(n))
LeetCode 716. Max Stack(两个栈实现最大栈,要求 pop,push,get_max 都为O(1))
LeetCode 860. Lemonade Change
LeetCode 862. Shortest Subarray with Sum at Least K
LeetCode 876. Middle of the Linked List
LeetCode 946. Validate Stack Sequences
1209. Remove All Adjacent Duplicates in String II
1210. Find Median from Data Stream.
1211. Course Schedule. 拓扑排序,要求建图、排序代码,输出排序结果
1212. 之字打印二叉树
1213. 链表有无环
1214. 礼物的最大价值
1215. 加减乘除求开方(剑指无)
手写归并排序.
快速排序
拓扑排序问题
写个代码,蛇形打印数组
背包问题,找零钱
含有重复数的排好序的数组进行查找
如何通过n+logn-2次比较得到最大和次大的数
一个是所有奇数排到偶数前面,另一个是数的最大宽度,最后一个是字典树
给你一个无序数组,给你一个K,求所有和为k的倍数的子序列的个数,如果换成子数组呢,时间、空间复杂度分别是多少?
二叉树两个节点间的最长距离
判断一棵二叉树是否为平衡二叉树
海量数据TopK问题
.coding(找到小于N的素数个数
堆排序

给出二叉树,中序遍历转双向链表
字符串挑k长度子串,使其字典序最小

第一个是两个链表的公共结点,第二个是给定栈,保证栈的效率的同时能够在O(1)返回栈的最大值。

删除字符串中连续的重复字符

判断二叉树上是否存在一条从根结点到叶结点的路径,满足其上的元素之和等于target。

Q:写个编程题吧:两个集合A,B,求A,B的交集(假设A长度为n,B长度为m)
A:1.这个最简单的解法遍历B时候,逐个检查是否在A出现过,复杂度是O(n*m),
2.我们对A预先排序以后能达到O(max(nlogn , mlogn)),
3.如果A中最大值不大的话,可以开一个数组nums[max(A)](打表)记录A中出现元素,这样复杂度是O(m),但是空间复杂度取决于A的最大值
4.我们可以用hashmap把A中的元素记录下来,这样复杂度是O(m),空间复杂度大概O(n)
(我感觉,简单的题如果能给出整个优化的过程,会比较好,而且能拖一点点时间…)
Q:那么如果A,B很大,内存装不下呢?
A:我们可以把A,B通过Hash分桶以后,每个桶单独处理,然后在合并起来
Q:如果某个桶元素很多呢?
A:可以做二次哈希
Q:(心里想:既然你会A+B,那么你把这个偏微分方程求解一下吧)
Q:再写个编程题吧:一个字符串,最少切几刀,使得每个子串都是回文的?
A :…我们可以拿DFS求,如果当前串是回文的就返回,如果不是,遍历当前串切割点,递归计算左右两个字符串的最小切割数,最后取最小。
Q:你这个太复杂了,怎么优化
A:(这个题对我来说真的难,搞了半天没搞出来,心态有点慌,最后没办法了,面试官手把手教我怎么写…)

n个数,能够组合成多少种排序树?
无穷长的数组中,每次只能读取一个数字,最后我们需要等概率的选取m个数,怎么选?

Q:我们来个编程题吧:二叉树,输出每一层最左面的结点值
A:这个用层序遍历,解决起来比较容易理解,也可以用先序遍历,因为,先序遍历时候,一定可以保证每一层最左面的结点,最先访问
其他结点后面访问,那么我们可以开一个map,map(h)=a 表示第h层的第一个结点值是a,先序遍历时候可以把层数传进去,然后每次检查
map中当前层是否存在,如果不存在就保存,存在的话就不管了。
A:说完思路写完后,我说非递归也可以写
Q:那你写写
A:写着写着感觉不对劲,层数没法知道,一个方法是把树结点结构体里面加上层数,但是这样破坏了原始结构,另一个方法是开了个记录层数的栈,和结点栈同时入栈出栈,解决了。
Q: 好了,我这里没问题了

前序中序转二叉树(lc原题,用字典记录一下中序里各值的索引,然后递归即可)
旋转数组查找target(lc原题,我的解法是根据左侧递增还是右侧递增来做对应的二分,当然还有一种是先二分找到旋转点然后两侧再分别二分)

(剑指offer-41,数据流中的中位数):设计一个数据结构,有插入和删除操作,并且能随时得到数据中的中位数

(剑指offer-58题目二,左旋转字符串):给定一个字符串S[0…N-1],要求把S的前K个字符移动到S的尾部,比如字符串"abcdef",前面两个字符 ‘a’ 'b’移动到字符串的尾部,得到新字符串"cdefab",即字符串循环左移K。要求:时间复杂度O(n),空间复杂度O(1)

求2的平方根,精度0.00001

最长公共子序列

算法题,买卖股票DP问题
输入一个list然后输出这个list的全排列组合,leetcode简单题
给定一个list然后求出和为K的两个数,也是leetcode简单题,双指针秒答

给一个数N,k
每一轮可以进行两种操作的其中一种

  1. 所有的数拆分成两个更小的数
  2. 所有的数-1
    已知拆分操作只能进行k次
    问 最少需要多少次把所有数都消去

2)给一串数列,这串数列有正有负,但是总和为0。每个数xi代表一个村庄,正的表示村庄想卖出xi份水果,负的表示想买入xi份水果。两相邻村庄间的距离是相同的,单位距离运送一份水果的运费均相同,每份都是k。问,把每个村庄的需求和供给都解决掉需要的最少运送费是多少?

  1. 判断链表有没有环;判断链表的环的起点
  2. 给定n个区间[a,b], 找到最小的区间[x,y],使得n个区间都至少包含一个数落在这个[x,y]中(不会啊救命)

两个有序数组的中位数(不要用O(N)的暴力算法,要用二分的思想)
2. 找出一个正整数数组中,没出现过的最小的正整数(不能先排序,要用比排序时间复杂度更优的方法)

leetcode编辑距离
给了一个字符数组,求这些数组的组合,例如{a,b,c}的答案是{a,b,c,ab,ac,bc,abc}
一个数组,一个数出现一次,其他数出现两次,求出现一次的那个数。
一个数组,两个数出现一次,其他数出现两次,求那两个数。

查找一个有序数组旋转后中有无key值。
一个人初始体力为m,起始点为0,终点为n。一路上有毒蘑菇和体力蘑菇,用v_i表示,吃了会有体力的增加或减少,走多少步就消耗多少体力。问这个人能否到达终点,如果能,最小体力是多少。(不太会)

两个栈模拟一个队列
求两个链表的第一个公共结点。
类似于二叉树最短路径

一个圆 问走n步回到原点多少种方法
简单dp 3分钟秒过
2 input : 无序的实数数组
output:求大小相邻两个数之间的最大差

构建哈夫曼树

代码写一个决策树,给定数据,启发函数是信息增益,假设所有特征的值都是数值类型的:定义节点类、构建节点、选取当前节点的最优划分特征(计算所有特征的信息增益)、数据划分、构建子节点、考虑停止划分的条件。花了好长时间写了个代码框架,然后和面试官讲了思路。

python在15min内写一个单通道的图像卷积

写代码,在一个大数组中找到和为100的所有数对

然后就问了一道算法题,就是著名的 小兔的棋盘,我后来查了一下,是什么卡特兰数。然而面试的时候我没听说过这一道题,不过还是磕磕绊绊地用DFS解出来了,面试官说可以了,也没让我继续用DP来解。哎,算法还是有点菜的。

二面也是问了一道算法题,是寻找迷宫中的最短路径,迷宫中1表示有墙,路不通,0表示可以走。我脑子不知道怎么抽了,直接想用DFS来解,给面试官讲了一下思路。面试官提醒我,DFS和BFS你是怎么考虑用哪个的。然后我就明白了,应该用BFS,讲了一下BFS和DFS适用的场景。然后用BFS比较顺利的写出了程序。

A文件有m个专有名词,B文件有n个query,统计每个专有名词出现的次数。回答这个问题,主要其实就是考虑复杂度和分布式的知识,以及如何在query中查找专有名词(本身比较简单,考虑复杂度就不简单了)。不过我对分布式了解的不多,就只是自己手动分布式了以下。

一个正整数数组,寻找连续区间使得和等于target,简单的用两个指针做出来了,不过让我证明一下解法的正确性,纠结了一会儿也算是证明出来了。然后如果里面有负数怎么做,很顺利的讲出来了。

找第K大的数(快排)

从n个数字的数组中任取m个为一个组合,返回所有组合,顺序不一样的算一个组合(递归遍历+回溯)

算法:一个排好序的数组 arr 中,可能有重复数字,给定一个数target,求 arr[i] + arr[j] = target (i < j) 的对数。
提了两个方法:
1)一个字典记录出现过的数字和对应的索引列表(因为可能有重复,所以是列表)。然后一边遍历一边查询字典中是否出现了 target - arr[i],如果有则计数。
2)双指针。
但是有重复的数很麻烦,我考虑了一般的重复数情况,和两个重复数之和恰好为target的情况。但是面试官说还有别的情况,我就想不出来了,然后面试官说先到这吧。。。

旋转数组中搜索某个目标值。

二维矩阵,求连通区域数量(连通的定义: 两个像素是四邻接的邻居,并且像素值的差的绝对值小于等于16,那么这两个像素是连通的)。

小明需要踩着石头过河。
下一步只能到达距离为3、4、5石头。
给一个数组,里面是n个石头,以及石头到岸边的距离。
假设从小到大排序。

问能否到达对岸(到达第n块石头)?

我的方法:
用深搜+剪枝的递归实现。
复杂度O(n)
(不知道有没有做对)
另一个思路是动态规划

10个小球,随机分到12个盒子里,求恰好10个盒子都为空的概率。要求用Python程序模拟十万次,暴力求出该概率。
看到这题我懵了,让我蒙特卡洛模拟?伪随机数也不好近似出概率啊,误差大的一批。头一次见不要手推数学公式,特意要求你暴力的数学题。话不多说,动手开始写,balabala,模拟完了,在牛客网一运行,我懵了,输出在十万分之一到十万分之3之间波动(十万次只有两三次恰好10个盒子为空),题目要求一共只能模拟十万次,我开始怀疑人生,检查代码,并且重新设置了随机种子,结果还是很小的概率。一下急了,情急之下打印出来前几次模拟的结果,确实很难出现恰好10个盒子同时为空。然后就跟面试官说,这个概率太低了,同时模拟十万次又太少,所以模拟出来的结果很小。然后面试官没说啥了,直接下一题。好像他也是随便选的题目,自己没做过,只是看到这个题目在题库里分类是数学,就选了这个。我也不知道这个题目的用意是啥,也不知道自己是不是想错了。(PS: 面试之后我直接算概率,C(12,2)(210-2)/(1210)=1.091e-06,如果我算错了,欢迎各位指出。)
直接计算概率: 10个小球,随机分到12个盒子。每个小球都有12个可能,事件总数是1210。事件“恰好10个盒子为空”意味着:将10个球随机分到12个盒子的两个盒子中(这两个盒子不能有任何一个为空)。C(12,2)决定是哪两个盒子不为空;将10个球分到两个盒子中,有210种可能(不能确保两个盒子均为非空的),需要再减去两个盒子中有一个盒子为空的情况(共2种可能,设盒子为A、B,即“A为空并且B非空”和“A非空并且B为空”这两种可能)。所以最后结果为C(12,2)
(210-2)/(1210)。
(写这一题的时候我用的random包(牛客网系统不让导numpy),random.randint(0,12),发现数组越界,事后发现原来API果然不一样,random.randint(0,12)包括了右端点12,而numpy.random.randint(0,12)是不包括右端点12的,巨坑,平时使用numpy.random比较多,难怪面试的时候数组越界)

import random
random.seed(4)
n=100000
cnt=0
for i in range(n): 
    arr=[0]*12
    for j in range(10):
        rnd=random.randint(0,11)
        arr[rnd]+=1
    cnt0=0 
    for j in range(12):
        if arr[j]==0:
            cnt0+=1
    if cnt0==10:
        cnt+=1
print(cnt/n)

二分查找元素在有序数组中的位置,如果不存在,输出-1,如果存在,输出下标(存在多个,输出下标最小的)。
水的不能再水的题,但是一开始没处理好有重复数字的情况,只过了30%用例(面试过程你可以自己提交代码,并且可以看到一个错误用例,跟牛客网练习模式一样),比如4,4,5,6,7里面找4,我的代码返回了1,本该返回0。后面处理了一下,AC了,二分都不能一次通过,差点急出一把汗。

def getPos(arr,val):
    n=len(arr)
    l=0
    r=n-1
    while l<r:
        mid=(l+r)//2
        if arr[mid]>=val:
            r=mid
        else:
            l=mid+1
    if arr[l]!=val:
        return -1
    return l

给定一个数组,找出数组的最长连续子序列。例:3,3,4,7,5,6,8,最长的连续子序列(这里的连续是说连续整数,整个子序列是连续整数,我一开始题都没看明白)应该是(3,4,5,6),需要返回它们的下标(1,2,4,5)。如果存在多种答案,只需给出任意一组下标。面试官看我不会,让我先写一个暴力的方法,我还是不会啊,然后一个小时过完了,凉凉。

import sys
line=sys.stdin.readline().strip()
n=int(line)
line=sys.stdin.readline().strip().split(" ")
arr=[]
for x in line:
    arr.append(int(x))
MAX=0
rtn=[]
for i in range(n):
    val=arr[i]
    ans=[]
    for j in range(i,-1,-1):
        if val==arr[j]:
            val-=1
            ans.append(j)
    if MAX<len(ans):
        MAX=len(ans)
        rtn=ans[::-1]
print(MAX,rtn)
a=[3,3,4,7,5,6,8]
n=len(a)
pre=[0]*n
dic={}
idx={}
 
MAX_len=0
dic[a[0]] = 1
pre[0] = -1
last = 0
idx[a[0]] = 0
 
for i in range(1,n):
    if a[i] not in dic:
        if a[i]-1 not in dic:
            dic[a[i]]=1
            pre[i]=-1
        else:
            dic[a[i]]=dic[a[i]-1]+1
            pre[i]=idx[a[i]-1]
        idx[a[i]]=i
    else:
        if a[i]-1 not in dic:
            pass
        elif dic[a[i]]<dic[a[i]-1]+1:
            dic[a[i]]=dic[a[i]-1]+1
            pre[i]=idx[a[i]-1]
            idx[a[i]]=i
    if dic[a[i]]>MAX_len:
        MAX_len=dic[a[i]]
        last=i
rtn=[]
res=[]
while last!=-1:
    rtn.append(last)
    res.append(a[last])
    last=pre[last]
print("val:",res[::-1])
print("index:",rtn[::-1])

一辆巴士载了25人,路经10个车站。每个乘客以相同的概率在各个车站下车。如果某个车站有乘客要下车,则大巴在该站停车。每个乘客下车的行为是独立的。记大巴停车次数为X,求X的数学期望(要求通过编程求数学期望)。
根据数学期望的定义进行计算,跟一面一样,继续蒙特卡洛模拟。面试官问我,如果乘客变为50人,估计一下数学期望会变为多少,应该是接近10。

import random
n=10000
cnt=[0]*11
for i in range(n):
    arr=[0]*10
    for j in range(25):
        rnd=random.randint(0,9)
        arr[rnd]+=1
    SUM=0
    for j in range(10):
        if arr[j]>0:
            SUM+=1
    cnt[SUM]+=1
ans=0.0
for i in range(11):
    ans+=i*cnt[i]/n
print(ans)

给定N种不同颜色的球以及每种颜色的球的数量,把它们放进一个容器里面,随机抓取。要求写程序实现该功能,并且要按照每种颜色球的概率返回对应的球的编号。
比如,有A, B, C 3种颜色的球,数量分别是1,2,3。然后把它们统一放入盒子里,随机抓取(使用random随机生成(0, 1)之间的小数),要求按照它们各自的频数返回对应的颜色的球。
解答思路;
正巧研究了下k-means++的算法原理,按照这个思路,比较简单快捷地实现了下。尴尬的是,中间有其他开会的人误闯进来(幸好我是在他们前面预定的会议室),然后敲代码的过程中又忽然间断线了(第一次面字节的时候网络卡到爆,这次用自己的流量开热点还掉线,简直哭晕在厕所,幸好提前把思路提纲写在了代码编辑区域)。

import random
def calc(N, CS):
    """
    :param N:  表示小球的颜色数量
    :param CS: 表示每一种颜色的小球数量
    :return: 随机抓取的小球颜色编号
    """
    # 计算小球总数
    dsum = sum(CS)
 
    # 存储每种颜色的小球的概率
    ps = [0]
    for i in range(N):
        ps.append(CS[i]/dsum)
 
    # 按照概率划分区间
    dct = {}
    tmp = 0
    for i in range(N):
        ps[i+1] += ps[i]
        dct[(ps[i], ps[i+1])] = i
 
    tn = random.random()
    print('random int: ', tn)
    rst = 0
    for ky in dct.keys():
        if ky[0] <= tn < ky[1]:
            break
        rst += 1
    print('number of colors: ', rst)
    return rst
    pass
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
字节跳动是一家知名的互联网公司,提供多样化的在线服务和产品。在字节跳动的go实习面经中,通常会包含以下几个方面的内容: 1. 基础知识测试:字节跳动会对应聘者的基础知识进行测试,例如数据结构、算法、计算机网络等方面的知识。这一部分的问题可以是选择题、填空题、编程题等形式,用于评估候选人的基础水平。 2. 项目经历和实践能力评估:字节跳动也会关注应聘者的项目经历和实践能力,询问候选人在实习或学校项目中担任的角色、面临的挑战、解决方案以及取得的成果。通常会以开放性问题形式出现,侧重考察候选人的思维能力和解决问题的能力。 3. 技术深度面试:在技术深度面试环节,字节跳动会聚焦于候选人在Go语言相关技术方面的掌握情况。例如对候选人对Go语言的理解、熟练程度以及应用经验进行详细的询问和讨论。 4. 沟通与团队合作:字节跳动非常注重候选人的沟通能力和团队合作能力。所以在面试过程中,他们可能会提问候选人在团队合作中的角色、如何和其他成员协作以及如何解决团队遇到的问题等。 5. 自我介绍和问题回答:面试的最后要候选人进行自我介绍,这是一次展示个人的机会。同时,面试官还可能询问一些与实习相关的问题,了解候选人对实习的期望、目标以及对字节跳动的了解程度。 综上所述,字节跳动的go实习面经主要包括基础知识测试、项目经历和实践能力评估、技术深度面试、沟通与团队合作以及自我介绍和问题回答等环节。应聘者需要准备充分,熟悉Go语言相关知识,并能够展示自己的技术能力、项目经历以及团队合作等方面的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值