美文网首页
面试以及扩展

面试以及扩展

作者: 做一只有趣的芦苇 | 来源:发表于2020-12-24 15:37 被阅读0次

    3 不限于leecode了,其他一些代码的实践也准备加进来

    三短代码让你知道什么是yield
    原始的不递归fib写法

    def fib(n):
        ans = []
        i = 0 
        a, b = 0, 1
        while (i < n):
            a, b = b , a + b
            ans.append(a)
            i +=1 
        print(ans)
    

    手动实现fib的写法

    class Fab():
        def __init__(self, n):
            self.a = 0
            self.b = 1
            self.max = n
            self.iter = 0
        
        def next(self):
            if(self.iter<self.max):
                self.a, self.b = self.b, self.a + self.b 
                self.iter += 1
                return self.a 
            raise StopIteration()
    

    利用Python yield的写法,优点,可以节省内存, 只是生成一个迭代器

    def fib(n):
        r,a,b = 0,0,1
        while(r<n):
            a,b=b,a+b
            r+=1
            yield a
    a = fib(10)
    print(next(a))
    

    5. 牛客网设计LRU缓存结构

    联想python中有什么先进先出的结构

    # lru design
    # @param operators int整型二维数组 the ops
    # @param k int整型 the k
    # @return int整型一维数组
    # def LRU(self , operators , k ):
    import collections
    import sys
    class Solution:
        def __init__(self, k):
            self.dic = collections.OrderedDict() 
            # 关于orderdict的牛逼之处可以看博客 https://blog.csdn.net/qq_41648043/article/details/82878812
            #当然这里简要说一下:
            # 1. 按照插入的顺序排列,不是key本身排序
            # 2. popitem方法默认参数last=True,删除最后一个,如果想删除第一个设置为False
            self.capacity = k
         
        def set(self, key, value):
            if key in self.dic:
                self.dic.pop(key) #先pop再加入保证永远都是最新的,优先级最高
            else:
                if self.capacity > 0:
                    self.capacity -= 1
                else:
                    self.dic.popitem(False) #达到容量时,先进先出(删除)
            self.dic[key] = value
         
        def get(self, key):
            if key not in self.dic:
                return -1
            val = self.dic.pop(key)
            self.dic[key] = val
            return val
         
    for line in sys.stdin.readlines():
        line = line.strip()
        line = line.replace(' ', '')
        a = line.split(']],')
        k = int(a[1])
        res = []
        s = Solution(k)
        for item in a[0][2:].split('],['):
            m = item.split(',')
            if m[0] == '1':
                s.set(int(m[1]), int(m[2]))
            else:
                res.append(s.get(int(m[1])))
        print(str(res).replace(' ', ''))
    

    5. 这里记录一个面试遇到的问题

    https://blog.csdn.net/qq_34342154/article/details/77388913
    面试官还问了一个升级版本:
    如果给定的数组是无序的,多次要查询某个字符串所在的位置,有什么办法?
    通过哈希分桶,把哈希相同的放到一个桶中,记录在哈希表中,每次去查哈希表就可以

    6. 这里是在寻找5的过程中碰到一个很好的博客,可以跟着做程序员代码指南的部分

    https://blog.csdn.net/qq_34342154/article/details/77918297

    不能停~~总结下最近面试被问到的一些算法题目

    1 百度面试官自己YY出来的题目

    百度问到:
    比较简单第一个
    N+1 个数中一定包含1-N中所有元素外加一个在 1-N之间(包含)的重复元素
    求出这个重复元素

    题目加强:
    N+1 个数中一定包含1-N中所有元素外加两个在 1-N之间(包含)的重复元素
    求出这两个重复元素

    沿用第一个思路可以得到这两个数的和
    然后只要再得出两个数的其他关系,就可以求出这两个数
    这里想到乘法,但是乘法容易溢出,所以我答了乘法后取对数的思路

    相当于知道了 a+b 和 log(a) + log(b), 后面就是数学上的事情了

    5 15. 三数之和

    个人的第一个版本, 有问题的地方注释了

    def threeSum(self, nums: List[int]) -> List[List[int]]:
            if len(nums) < 3:
                return []
            res = []
            nums.sort()
            print(nums)
            for i in range(len(nums)):
    #这里要想一下如何去掉重复的情况
                low, high = i+1, len(nums) - 1
                while(low < high):
                    if nums[low] + nums[high] + nums[i] > 0 :
                        high -= 1
                    elif nums[low] + nums[high] + nums[i] < 0 :
                        low += 1
                    else:
                        res.append([nums[i],nums[low],nums[high]])
                        low += 1 
                        high -= 1
                        break # 这里显然是不对的,第一次满足后,在low high 内部可能依然存在满足条件的组合
            return res
    

    改进之后发现还是报错,错误case : 输入为 [-2,0,0,2,2] 发现是没有考虑当 0 2 和 0 2 重复的情况 所以要再做一次判断 , 最终改正的代码如下:

    def threeSum(self, nums: List[int]) -> List[List[int]]:
            if len(nums) < 3:
                return []
            res = []
            nums.sort()
            for i in range(len(nums)-2):
                if i > 0 and nums[i] == nums[i-1]:
                    continue
                low, high = i+1, len(nums) - 1
                while(low < high):
                    if nums[low] + nums[high] + nums[i] > 0 :
                        high -= 1
                    elif nums[low] + nums[high] + nums[i] < 0 :
                        low += 1
                    else:
                        res.append([nums[i],nums[low],nums[high]])
                        low += 1 
                        high -= 1
                        #这里加入重复判断
                        while low < high and nums[low] == nums[low-1]:
                            low += 1
                        while low < high and nums[high] == nums[high+1]:
                            high -= 1
            return res
    

    6 18. 四数之和

    还是稍微看了下思路,三数会了四个的还是不会,智商堪忧啊。。。

    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
            if len(nums) < 4 : 
                return []
            nums.sort()
            res = []
            for i in range(len(nums)-3):
                if i > 0 and nums[i] == nums[i-1]:
                    continue
                for j in range(i+1,len(nums)-2):
                    if j > i + 1 and nums[j] == nums[j-1]:
                        continue
                    low, high = j+1, len(nums)-1
                    while(low < high):
                        sum_value = nums[i] + nums[j] + nums[low] + nums[high]
                        if sum_value == target:
                            res.append([nums[i],nums[j],nums[low],nums[high]])
                            low += 1
                            high -= 1
                            while low < high and nums[low] == nums[low-1]:
                                low += 1
                            while low < high and nums[high] == nums[high+1]:
                                high -= 1
                        elif sum_value > target:
                            high -= 1
                        else: 
                            low += 1 
            return res
    

    相关文章

      网友评论

          本文标题:面试以及扩展

          本文链接:https://www.haomeiwen.com/subject/cidqgktx.html