这周三参加了一场字节后端研发实习生面试(人生中的第一场校招面试)。在得到一面通知的时候我还有些埋怨自己,太过鲁莽,没有面试经验,第一次面试就敢投大厂,还居然是研发岗。
不由得想:小徐真是膨胀了。
言归正传,字节一面时遇到的算法题:三数之和。
(随手写一下解析,顺便盘点一下自己的问题)
看到这题的时候我就在想:这类求和型的问题用暴力解是最为直观、简单的,但是你在写算法题的时候只能想到一种解,而且还是一种最笨的方法求得的解,是不是有点侮辱大厂面试官了?
(好吧,我承认,我当时只写了一种出来,感觉非常对不起面试官的引导)
于是面试结束之后,又重新写了一遍这题。
可恶,又出现了问题。
我居然在开头就使用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
结果,(微笑)
谁能告诉我,这个猥琐的输入示例是怎么回事?(微笑)
怎么会有人输入这么多零啊!!!!!!!!(摔)
所以现在是时间问题,代码还需要优化(微笑脸)