栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

结果,(微笑)

谁能告诉我,这个猥琐的输入示例是怎么回事?(微笑)
怎么会有人输入这么多零啊!!!!!!!!(摔)

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/571547.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号