字节跳动计算机视觉算法工程师面试题(秋招)
·
1、BN过程,为什么测试和训练不一样?
对于BN,在训练时,是对每一批的训练数据进行归一化,也即用每一批数据的均值和方差。
而在测试时,比如进行一个样本的预测,就并没有batch的概念,因此,这个时候用的均值和方差是全量训练数据的均值和方差,这个可以通过移动平均法求得。
对于BN,当一个模型训练完成之后,它的所有参数都确定了,包括均值和方差,gamma和bata。
2、Leeetcode:160相交链表
方法一:暴力解法
对于A中的每一个结点,我们都遍历一次链表B查找是否存在重复结点,第一个查找到的即第一个公共结点。
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
p = headA
while p:
q = headB
while q:
if p == q:
return p
q = q.next
p = p.next
return p
时间复杂度:O(n^2)
空间复杂度:O(1)
无法通过,会超时。
方法二:
对暴力解法的一个优化方案是:先将其中一个链表存到哈希表中,此时再遍历另外一个链表查找重复结点只需 O(n) 时间。
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
s = set()
p,q = headA,headB
while p:
s.add(p)
p = p.next
while q:
if q in s:
return q
q = q.next
return None
时间复杂度:O(n)
空间复杂度:O(n)
方法三:走过彼此的路
利用两链表长度和相等的性质来使得两个遍历指针同步。
具体做法是:让两指针同时开始遍历,遍历到结尾的时候,跳到对方的头指针,如果有公共结点,则,会同时到达相遇的地方。
代码如下:
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
p,q = headA,headB
while p != q:
p = p.next if p else headB
q = q.next if q else headA
return p
时间复杂度:O(n)
空间复杂度:O(1)
3、概率题:两个人轮流抛硬币,抛到正面获胜,反面给对方。先抛的人胜率是多少?
先抛的人胜率是 2/3
A先,B后
P(A) = 1/2 + //A直接取胜
1/2 * 1/2 * 1/2 + // A1失败B1失败A2取胜
1/2 * 1/2 * 1/2 * 1/2 *1/2 + //A1失败B1失败A2失败B2失败A3取胜
...
p(A) = 1/2 + (1/2)^3 + (1/2)^5 + (1/2)^7 + ...
等比数列求和
p(A) = 1/2 * (1 - (1/4)^n) / (1 - 1/4) = 2/3
P(B) = 1/2 * 1/2 + // A1失败B1取胜
1/2 * 1/2 * 1/2 * 1/2 + // A1失败B1失败A2失败B2取胜
1/2 * 1/2 * 1/2 * 1/2 * 1/2 * 1/2 + //A1失败B1失败A2失败B2失败A3失败B3取胜、
...
p(B) = (1/2)^2 + (1/2)^4 + (1/2)^6 + ..
p(B) = 1/4 * (1 - (1/4)^n) / (1 - 1/4) = 1/3
更多推荐


所有评论(0)