列表data的值爲[1, 3, 4, 5, 8, 9, 11],找出這個列表中和爲13的兩個數字的全部組合。這個好找,上過幼兒園大班的,估計都能找出來。4+9=13, 5+8=13。如何用python寫一個函數來實現呢。python
解法一:app
超級大循環ide
最容易想到的就是遍歷啊。嵌套循環,外層循環遍歷所有列表,內層循環遍歷當前元素位置以後的全部元素。內層循環中將兩個數字相加,等於13就break。妥妥找到。函數
def equalSum01(data=None, twosum=13): result = [] for i, vi in enumerate(data): if i + 1 > len(data) - 1: break for j, vj in enumerate(data[i+1:]): if vi + vj == twosum: print(vi, vj) result.append((vi, vj)) break return result
解法二:單元測試
首尾相加法測試
由於data是升序排列的一個列表,咱們能夠用兩個指針l, r指向列表的兩端,那麼data[l]+data[r]的和有3種狀況:
指針
一、等於S,那就將這兩個數字添加的結果列表中,l指針右移,r指針左移it
二、小於S, 將l指針右移class
三、大於S, r指針左移test
def equalSum02(data=None, twosum=13): result = [] l = 0 r = len(data) - 1 while l < r: if data[l] + data[r] == twosum: result.append((data[l], data[r])) l += 1 r -= 1 elif data[l] + data[r] < twosum: l += 1 else: r -= 1 return result
解法三:
精準搜索法
遍歷data, 期待值 = S - data[i], 若是這個期待值在data[i]右面的剩餘列表中,則找到,遍歷萬一遍,也就找到了全部的。
def equalSum03(data=None, twosum=13): result = [] for i, v in enumerate(data): if (twosum - v) in data[i+1:]: result.append((v, twosum - v)) return result
從時間複雜度上來講,解法一是時間複雜度最大的一個。解法三由於每次循環都要搜索剩餘的列表,應該大於解法二。
單元測試
import unittest class TestInverseMethods(unittest.TestCase): def test_equalSum01(self): data = [1, 3, 4, 5, 8, 9, 11] result = [(4, 9), (5, 8)] self.assertEqual(equalSum01(data), result) def test_equalSum02(self): data = [1, 3, 4, 5, 8, 9, 11] result = [(4, 9), (5, 8)] self.assertEqual(equalSum02(data), result) def test_equalSum03(self): data = [1, 3, 4, 5, 8, 9, 11] result = [(4, 9), (5, 8)] self.assertEqual(equalSum03(data), result) if __name__ == '__main__': unittest.main()
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
(4, 9)
(5, 8)
==bingo==