面试以及扩展

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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容