給定乙個整數陣列 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 但是通過檢視官方的...