python3面試題-一個包含n個整數的數組a,判斷a中是否存在三個元素,a,b,c,使得a+b+c=0


面試題

一個包含n個整數的數組a,判斷a中是否存在三個元素,a,b,c,使得a+b+c=0?

找出所有和為0並且不重復的三元組。不可包含重復的三元組。

如;a=[-1,0,1,2,-1,-4]

輸出:[[-1,-1,2],[-1,0,1]]

如:a=[]

輸出[]

如:a=[1,2]

輸出[]

思考:

實現:假如a的數組有6位數字,3位數字組合在一起,組合的情況就有C63=6*5*4/(1*2*3)=20種情況,

  這20種情況,可能有重復的;此時,我們需要去重;

    方式1:先判斷符合的數組,再去重;和為0的數組,排序后,判斷是否在最終結果數列中,同時往最終結果數列中追加的數列需要排序;

    方式2:先去重,再判斷符合的數組;可以通過set去重的方式實現,set中不可包含數組、可包含元組,同時每個元組中的數據也需要排序;

a=[1,2,3]
b=[[2,1,3]]
print(a in b) #False
a=[1,2,3]
b=[[1,2,3]]
print(a in b) #True

 

代碼實現:

a=[-1,0,1,2,-1,-4]
nl=[]
lnl=[]
num=len(a)
for i in range(num):
    for j in range(i+1,num):
        for k in range(j+1,num):
            nl.append(tuple(sorted([a[i],a[j],a[k]]))) #這里需要排序,然后使用set去重;set集合里只能包含元組、不能包含數組
print(len(nl),nl)
nls=set(nl) #去重;
print(len(nls),nls)
for i in nls:
    if i[0]+i[1]+i[2]==0:
        lnl.append(list(i))
print(lnl)

運行結果:

20 [(-1, 0, 1), (-1, 0, 2), (-1, -1, 0), (-4, -1, 0), (-1, 1, 2), (-1, -1, 1), (-4, -1, 1), (-1, -1, 2), (-4, -1, 2), (-4, -1, -1), (0, 1, 2), (-1, 0, 1), (-4, 0, 1), (-1, 0, 2), (-4, 0, 2), (-4, -1, 0), (-1, 1, 2), (-4, 1, 2), (-4, -1, 1), (-4, -1, 2)]
14 {(-1, -1, 2), (-4, 0, 2), (-4, 1, 2), (-1, 0, 2), (-1, -1, 1), (-4, -1, 2), (0, 1, 2), (-4, -1, -1), (-4, 0, 1), (-1, -1, 0), (-1, 0, 1), (-1, 1, 2), (-4, -1, 1), (-4, -1, 0)}
[[-1, -1, 2], [-1, 0, 1]]

寫成函數的格式:

def sums(numl,sum=0):
    nl=[]
    lnl=[]
    num=len(a)
    if num<3:
        return []
    for i in range(num):
        for j in range(i+1,num):
            for k in range(j+1,num):
                nl.append(tuple(sorted([a[i],a[j],a[k]]))) 
    # print(len(nl),nl)
    nls=set(nl) #去重;
    # print(len(nls),nls)
    for i in nls:
        if i[0]+i[1]+i[2]==sum:
            lnl.append(list(i))
    return lnl

a=[-1,0,1,2,-1,-4]
# a=[]
print(sums(a))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM