2021年9月初,字节秋招算法岗面试题5道

160 阅读3分钟

我正在参加中秋创意投稿大赛,详情请看:中秋创意投稿大赛

1、搜索旋转排序数组带重复值

该题为leetcode第81题,搜索先转排序数组 II

对于数组中有重复元素的情况,二分查找时可能会有 a[l]=a[mid]=a[r],此时无法判断区间 [l,mid] 和区间 [mid+1,r] 哪个是有序的。

例如nums=[3,1,2,3,3,3,3],target=2,首次二分时无法判断区间 [0,3][0,3] 和区间 [4,6][4,6] 哪个是有序的。

对于这种情况,只能将当前二分区间的左边界加一,右边界减一,然后在新区间上继续二分查找。

Pythonclass Solution:
def search(self, nums: List[int], target: int) -> bool:
if not nums:
return False

n = len(nums)
if n == 1:
return nums[0] == target

l, r = 0, n - 1
while l <= r:
mid = (l + r) // 2
if nums[mid] == target:
return True
if nums[l] == nums[mid] and nums[mid] == nums[r]:
l += 1
r -= 1
elif nums[l] <= nums[mid]:
if nums[l] <= target and target < nums[mid]:
r = mid - 1
else:
l = mid + 1
else:
if nums[mid] < target and target <= nums[n - 1]:
l = mid + 1
else:
r = mid - 1

return False

2、二叉树的之字形遍历

方法一:层序遍历 + 双端队列

  • 利用双端队列的两端皆可添加元素的特性,设打印列表(双端队列) tmp ,并规定:

奇数层 则添加至 tmp 尾部 ,

偶数层 则添加至 tmp 头部 。

算法流程:

  • 特例处理: 当树的根节点为空,则直接返回空列表 [] ;
  • 初始化: 打印结果空列表 res ,包含根节点的双端队列 deque ;
  • BFS 循环: 当 deque 为空时跳出;

新建列表 tmp ,用于临时存储当前层打印结果;

当前层打印循环: 循环次数为当前层节点数(即 deque 长度);

出队: 队首元素出队,记为 node;

打印: 若为奇数层,将 node.val 添加至 tmp 尾部;否则,添加至 tmp 头部;

添加子节点: 若 node 的左(右)子节点不为空,则加入 deque ;

将当前层结果 tmp 转化为 list 并添加入 res ;

  • 返回值: 返回打印结果列表 res 即可;

Pythonclass Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root: return []
res, deque = [], collections.deque([root])
while deque:
tmp = collections.deque()
for _ in range(len(deque)):
node = deque.popleft()
if len(res) % 2: tmp.appendleft(node.val) # 偶数层 -> 队列头部
else: tmp.append(node.val) # 奇数层 -> 队列尾部
if node.left: deque.append(node.left)
if node.right: deque.append(node.right)
res.append(list(tmp))
return res

3、Transformer Encoder和decoder的区别

Decoder和Encoder的结构差不多,但是多了一个attention的sub-layer,这里先明确一下decoder的输入输出和解码过程:

输出:对应i位置的输出词的概率分布输入:encoder的输出 & 对应i-1位置decoder的输出。所以中间的attention不是self-attention,它的K,V来自encoder,Q来自上一位置decoder的输出解码:这里要注意一下,训练和预测是不一样的。在训练时,解码是一次全部decode出来,用上一步的ground truth来预测(mask矩阵也会改动,让解码时看不到未来的token);而预测时,因为没有ground truth了,需要一个个预测。

4、transformer对比lstm的优势

Transformer 和 LSTM 的最大区别,就是 LSTM 的训练是迭代的、串行的,必须要等当前字处理完,才可以处理下一个字。而 Transformer 的训练时并行的,即所有字是同时训练的,这样就大大增加了计算效率。

5、Self-Attention公式为什么要除以d_k的开方

避免出现梯度消失点积注意力被缩小了深度的平方根倍。这样做是因为对于较大的深度值,点积的大小会增大,从而推动softmax函数往仅有很小的梯度的方向靠拢,导致了一种很硬的(hard)softmax。

例如,假设Q和K的均值为0,方差为1。它们的矩阵乘积将有均值为0,方差为 d_k 。因此,d_k 的平方根被用于缩放(而非其他数值),因为,Q和K的矩阵乘积的均值本应该为0,方差本应该为1,这样会获得一个更平缓的softmax。

最新升级的 《名企AI面试100题》 ,电子书限时免费送给需要的小伙伴(书有394页好大一本,全送纸质书有点儿hold不住),需要的可在评论区回复: 【100题】,看到后私信发你

本书涵盖计算机语⾔基础、算法和⼤数据、机器学习、深度学习、应⽤⽅向 (CV、NLP、推荐 、⾦融风控)等五⼤章节,为了照顾⼤家去官⽹对应的题⽬页⾯参与讨论,故本⼿册各个章节的题⽬顺序和官⽹/APP题库内的题⽬展⽰顺序 保持⼀致。 只有100题,但实际笔试⾯试不⼀定局限于本100题,更多烦请⼤家移步七⽉在线官⽹或 七⽉在线APP,上⾯还有近4000道名企AI笔试⾯试题等着⼤家,刷题愉快。