1兩數之和

2021-10-08 22:59:43 字數 2228 閱讀 9291

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。

你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。

示例:給定 nums = [2, 7, 11, 15], target = 9

因為 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

寫的時候輸出列表元素了,人家要求輸出下標,不過這不影響。

我的思路是由於結果唯一,找到就列印結果並結束整個for迴圈,後面的迴圈沒必要執行了;沒找到就列印個提示。

nums = [2, 7, 11, 15]

def func(target):

sign=0 # 是否找到結果的標誌位,0未找到,1找到

length=len(nums)

for i in range(length-1): # i從0到2

for j in range(i+1,length): # j從i+1到最後乙個元素

if nums[i]+nums[j]==target:

print([nums[i],nums[j]])

sign=1

break

if sign==1: # sign為1時,不再繼續外層迴圈,如果不加這個條件,func(22)執行到7+15時,列印完還會接著執行外層迴圈

break

elif (i==length-2) and (nums[i]+nums[j] != target): # 判斷最後一次比較

print('target not found!')

break

這裡用的都是break,是跳出當前迴圈,所以if的縮排與內層for一致。第二個if這裡一開始想寫for-else,else對應上面的for,不管哪乙個for,沒寫出來。

nums = [2, 7, 11, 15]

def func(target):

sign=0

length=len(nums)

for i in range(length-1): #i從0到2

for j in range(i+1,length): # j從i+1到最後乙個元素

if nums[i]+nums[j]==target:

print([nums[i],nums[j]])

sign=1

return # 相比break,找到後return就結束整個迴圈了,不會出現第一版注釋中找到後接著執行外層迴圈的情況

if sign==0: # 整個迴圈執行完了,沒找到時sign還是0

print('target not found!')

第二版的改進有2點:

return後面的注釋說了

沒找到時的判斷,第一版的太複雜。首先,因為if-elif的縮排對應內層迴圈,所以每次內層迴圈執行完,都會判斷是否找到;其次,沒找到時的最後一次比較太複雜,即elif。而第二版迴圈結束時標誌位沒變,那就是沒找到,只需要判斷標誌位就行。

nums = [2, 7, 11, 15]

def func(target):

length=len(nums)

for i in range(length-1): # i從0到2

for j in range(i+1,length): # j從i+1到最後乙個元素

if nums[i]+nums[j]==target:

return [i,j] # 由於結果唯一,找到後直接return結束整個迴圈

return '查無此果!'

while true:

print(func(int(input('請輸入要查詢的值:'))))

第三版的改進:取消了標誌位,更高效。找到時直接列印,然後迴圈直接結束;沒找到時說明外層迴圈執行完了,列印提示。這才符合我最初的思路。

補充:for迴圈即便寫成

for i in range(length):

for j in range(i+1,length):

當 i=2 時,j=3;下輪迴圈 i 變成3,此時 j 依然為3。不會出現因下標越界導致資料出錯的問題,我記得c++,有的編譯器有這個問題,有的沒有,那時候試了vc6.0,vs2015(也可能2017),devcpp with mingw,codeblocks with mingw。後兩個當時只是嘗鮮。

1 兩數之和

給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 解class solution hash nums i...

1 兩數之和

給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 由於元素不能重複利用,所以使用j i 1,通過雙迴圈,...

1 兩數之和

你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。public int twosum int nums,int target throw new illegalargumentexception no two sum solution 這樣的時間複雜度為0 nlogn 但是通過檢視官方的...