微软研究院面试2
背景:
- 面试的组做的是深度学习的方法对图像或视频流进行编码
- 电话面试。
- 面试流程主要是针对项目问些问题,然后说代码思路。
代码题:
- 滑动窗口的最大值:给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解题思路:
单调(双端)队列
(1)若 i > 0且 队首元素deque[0] = 被删除元素 nums[i - 1] :则队首元素出队;
(2)删除 deque 内所有 < nums[j] 的元素,以保持 deque非递增;
(3)将 nums[j] 添加至 deque 尾部;
'''
class Deque():
def __init__(self):
self.item=[]
def add_front(self,x):
self.item.insert(0,x)
def add_end(self,x):
self.item.append(x)
def delete_front(self):
self.item.pop(0)
def delete_end(self):
self.item.pop()
#Deque类就写写,不用。
'''
class Solution(object):
def maxSlidingWindow(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
if nums==[]:
return []
deque=[]
res=[]
n=len(nums)
#第1个滑动窗
deque.append(nums[0])
for i in range(1,k):
while deque and nums[i]>deque[-1]:
deque.pop()
deque.append(nums[i])
res.append(deque[0])
for i in range(1,n-k+1):#滑动窗口的起始坐标范围
if nums[i-1]==deque[0]:
deque.pop(0)
while deque and nums[i+k-1]>deque[-1]:
deque.pop()
deque.append(nums[i+k-1])
res.append(deque[0])
return res
暴力双层循环的时间复杂度是O(nk)
单调队列的时间复杂度是O(n)
- 用加减乘实现除法
应该是力扣上面的这道题 https://leetcode-cn.com/problems/divide-two-integers/
解题思路:
每次利用加法,将当前的divisor乘以两倍,并同时用multiple记录下乘以了2的多少次方,multiple的变化过程是1,2,4,8,16 。
举例:63 / 8 = (63-32) / 8 + 4 = (63-32-16) / 8 + 2 + 4 = (63-32-16-8) / 8 + 1+ 2 + 4 = 7
class Solution(object):
def divide(self, dividend, divisor):
"""
:type dividend: int
:type divisor: int
:rtype: int
"""
MIN_INT, MAX_INT = -2147483648, 2147483647 #[−2**31, 2**31−1]
flag=False #结果是否加负号
if dividend<0:
dividend=-dividend
flag= not flag
if divisor<0:
divisor=-divisor
flag= not flag
def div(dm,ds):
if ds>dm:
return 0
cur=ds
multi=1 #放大倍数
while dm>=cur+cur:
cur+=cur
multi+=multi
return multi+div(dm-cur,ds)
res=div(dividend,divisor)
if (not flag and res>MAX_INT) or (flag and res<MIN_INT):
return MAX_INT
if flag:
return -res
return res