微软研究院面试2

微软研究院面试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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值