Leetcode刷题日记:字节一面算法题

这周三参加了一场字节后端研发实习生面试(人生中的第一场校招面试)。在得到一面通知的时候我还有些埋怨自己,太过鲁莽,没有面试经验,第一次面试就敢投大厂,还居然是研发岗。

不由得想:小徐真是膨胀了。

言归正传,字节一面时遇到的算法题:三数之和。
(随手写一下解析,顺便盘点一下自己的问题)

在这里插入图片描述
看到这题的时候我就在想:这类求和型的问题用暴力解是最为直观、简单的,但是你在写算法题的时候只能想到一种解,而且还是一种最笨的方法求得的解,是不是有点侮辱大厂面试官了?
(好吧,我承认,我当时只写了一种出来,感觉非常对不起面试官的引导)

于是面试结束之后,又重新写了一遍这题。

可恶,又出现了问题。
我居然在开头就使用set去重函数,杜绝了所有[-i, -i, 2i]与[-2i, i, i]类型的解。
真想给自己鼓个掌。牛啊。

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        a=list(set(nums))
        a.sort()
        n=len(a)
        res=[]
        if n<2:
            return res

        for i in range(n-1):
            
            #这是第一个指针,一次循环中不改变
            first=i
            #定义二三指针的初始指向
            sec=i+1
            thr=n-1
            #接下来开始判断
            while i<(n-1):
                if first>=(n-2) or sec==thr:
                    break
                if a[first]+a[sec]+a[thr]==0:
                    res.append([a[first],a[sec],a[thr]])
                    thr=thr-1
                #说明第三个指针要减小
                elif a[first]+a[sec]+a[thr]>0:
                    thr=thr-1
                elif a[first]+a[sec]+a[thr]<0:
                    sec=sec+1
        return res

于是我把set从前面去掉,然后找了一组示例填进去:

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        a=list(nums)
        a.sort()
        n=len(a)
        res=[]
        if n<2:
            return res

        for i in range(n-1):
            
            #这是第一个指针,一次循环中不改变
            first=i
            #定义二三指针的初始指向
            sec=i+1
            thr=n-1
            #接下来开始判断
            while i<(n-1):
                if first>=(n-2) or sec==thr:
                    break
                if a[first]+a[sec]+a[thr]==0:
                    res.append([a[first],a[sec],a[thr]])
                    thr=thr-1
                #说明第三个指针要减小
                elif a[first]+a[sec]+a[thr]>0:
                    thr=thr-1
                elif a[first]+a[sec]+a[thr]<0:
                    sec=sec+1
        return res
    
s=Solution()
aa=s.threeSum([-1,0,1,2,-1,-4])
print(aa)

结果是:
在这里插入图片描述
现在的问题是答案中有重复解,嘿嘿,再用set给res去个重试试(用set给二维列表去重与一维去重不一样)(想了解set和sort具体的使用方法的可以看看我在python函数模块写的内容,通俗易懂,强推!)

a=[[-1, -1, 2], [-1, 0, 1], [-1, 0, 1]]

re=list(set([tuple(i) for i in a]))
print(type(re))
print(re)

print('*************************')
alist=[list(i) for i in re]
print(type(alist))
print(alist)

在这里插入图片描述
于是现在的程序变成了(只是修改了return部分):

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        a=list(nums)
        a.sort()
        n=len(a)
        res=[]
        result=[]
        if n<2:
            return res

        for i in range(n-1):
            
            #这是第一个指针,一次循环中不改变
            first=i
            #定义二三指针的初始指向
            sec=i+1
            thr=n-1
            #接下来开始判断
            while i<(n-1):
                if first>=(n-2) or sec==thr:
                    break
                if a[first]+a[sec]+a[thr]==0:
                    res.append([a[first],a[sec],a[thr]])
                    thr=thr-1
                #说明第三个指针要减小
                elif a[first]+a[sec]+a[thr]>0:
                    thr=thr-1
                elif a[first]+a[sec]+a[thr]<0:
                    sec=sec+1
                    
        result=list(set([tuple(i) for i in res]))
        result=[list(i) for i in result]
        return result

结果,(微笑)
在这里插入图片描述
谁能告诉我,这个猥琐的输入示例是怎么回事?(微笑)
怎么会有人输入这么多零啊!!!!!!!!(摔)

所以现在是时间问题,代码还需要优化(微笑脸)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值