网站开发常见问题,兼职做美工摄影去哪个网站,建立网站英文翻译,怎样做网络营销推广列表data的值为[1, 3, 4, 5, 8, 9, 11]#xff0c;找出这个列表中和为13的两个数字的所有组合。这个好找#xff0c;上过幼儿园大班的#xff0c;估计都能找出来。4913, 5813。如何用python写一个函数来实现呢。
解法一#xff1a;
超级大循环
最容易想到的就是遍历啊。嵌套… 列表data的值为[1, 3, 4, 5, 8, 9, 11]找出这个列表中和为13的两个数字的所有组合。这个好找上过幼儿园大班的估计都能找出来。4913, 5813。如何用python写一个函数来实现呢。
解法一
超级大循环
最容易想到的就是遍历啊。嵌套循环外层循环遍历全部列表内层循环遍历当前元素位置之后的所有元素。内层循环中将两个数字相加等于13就break。妥妥找到。
def equalSum01(dataNone, twosum13):result []for i, vi in enumerate(data):if i 1 len(data) - 1:breakfor j, vj in enumerate(data[i1:]):if vi vj twosum:print(vi, vj)result.append((vi, vj))breakreturn result解法二
首尾相加法
因为data是升序排列的一个列表我们可以用两个指针l, r指向列表的两端那么data[l]data[r]的和有3种情况
1、等于S那就将这两个数字添加的结果列表中l指针右移r指针左移
2、小于S, 将l指针右移
3、大于S, r指针左移
def equalSum02(dataNone, twosum13):result []l 0r len(data) - 1while l r:if data[l] data[r] twosum:result.append((data[l], data[r]))l 1r - 1elif data[l] data[r] twosum:l 1else:r - 1return result解法三
精准搜索法
遍历data, 期待值 S - data[i] 如果这个期待值在data[i]右面的剩余列表中则找到遍历万一遍也就找到了所有的。
def equalSum03(dataNone, twosum13):result []for i, v in enumerate(data):if (twosum - v) in data[i1:]:result.append((v, twosum - v))return result从时间复杂度上来说解法一是时间复杂度最大的一个。解法三因为每次循环都要搜索剩余的列表应该大于解法二。单元测试
import unittestclass 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.000sOK
(4, 9)
(5, 8)