列表data的值为[1, 3, 4, 5, 8, 9, 11],找出这个列表中和为13的两个数字的所有组合。这个好找,上过幼儿园大班的,估计都能找出来。4+9=13, 5+8=13。如何用python写一个函数来实现呢。

解法一:

超级大循环

最容易想到的就是遍历啊。嵌套循环,外层循环遍历全部列表,内层循环遍历当前元素位置之后的所有元素。内层循环中将两个数字相加,等于13就break。妥妥找到。

def equalSum01(data=None, twosum=13):result = []for i, vi in enumerate(data):if i + 1 > len(data) - 1:breakfor j, vj in enumerate(data[i+1:]):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(data=None, twosum=13):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(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 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.000s

OK

(4, 9)

(5, 8)

Python算法题----在列表中找到和为s的两个数字相关推荐

  1. Python算法题笔记

    Python算法题笔记 这是本人在学Python和算法题时做的笔记,包含一些Python的典型写法,有用的轮子调用,希望对大家有帮助. 分为三个部分,Python笔记,算法,经典题目,其中Python ...

  2. python输入两个整数a和b、比较两者的大小、使得a大于b_面试题解:输入一个数A,找到大于A的一个最小数B,且B中不存在连续相等的两个数字...

    玄魂工作室秘书 [玄魂工作室] 昨天发的算法有一处情况没考虑到,比如加一后有进位,导致又出现重复数字的情况,修正后今天重新发一次. 比如输入99,那B应该是101 因为100有两个连续相当的0. 基本 ...

  3. dart - 如何从Dart中的列表中找到最小值和最大值

    dart - 如何从Dart中的列表中找到最小值和最大值? 我已经尝试了以下代码段.但是它将引发有关类型转换的错误.因为列表具有整数和 double 值的组合.但是 **list.reduce(min ...

  4. 如何从Dart中的列表中找到最小值和最大值?

    dart - 如何从Dart中的列表中找到最小值和最大值? 我已经尝试了以下代码段.但是它将引发有关类型转换的错误.因为列表具有整数和 double 值的组合.但是 **list.reduce(min ...

  5. python权重是什么意思_在python带权重的列表中随机取值的方法

    1 random.choice python random模块的choice方法随机选择某个元素 foo = ['a', 'b', 'c', 'd', 'e'] from random import ...

  6. Python 算法题之 俄罗斯套娃信封

    Python 算法题之 俄罗斯套娃信封 文章目录 Python 算法题之 俄罗斯套娃信封 给出题目

  7. 面试题解:输入一个数A,找到大于A的一个最小数B,且B中不存在连续相等的两个数字...

    玄魂工作室秘书 [玄魂工作室] 昨天发的算法有一处情况没考虑到,比如加一后有进位,导致又出现重复数字的情况,修正后今天重新发一次. 比如输入99,那B应该是101 因为100有两个连续相当的0. 基本 ...

  8. python中列表下标_Python中如何在列表中找到某个元素的下标

    题目 对于列表 ["foo", "bar", "baz"]和在列表中的元素"bar",如何得到它的下标(1) 回答一 & ...

  9. python找到一行单词中最长的_在Python的给定列表中找到k个最长的单词

    我们有一种情况,我们必须从包含许多长度不同的单词的列表中选择前n个最长的单词.在本文中,我们将看到实现这一目标的各种方法. 与count()和sorted() 我们首先以相反的顺序对列表中的元素进行排 ...

最新文章

  1. clone git 修改保存路径_Git和Github详细入门教程(别再跟我说你不会Git和Github)
  2. 2017网易云创大会教育论坛,等你!
  3. Cocos Creator导出场景和预制的问题
  4. 大盘点!CVPR 2020目标检测论文精选
  5. Android开发实战二之Hello Android实例
  6. ajax前台转换json数据库,基于jQuery的ajax功能实现web service的json转化
  7. 兄弟j220怎么清零_兄弟打印机MFC_J220墨水回收盒满,该如何清零,望大神指教。...
  8. 【电子电路】RS485收发器两种典型电路
  9. mariadb安装几个问题
  10. 苹果Pro安装win10鼠标不能用的问题
  11. 创建图片外链——“极简图床”
  12. python数据可视化代码示例
  13. 收盘价对数收益率matlab,R语言怎么把股票日收盘价转换成对数收益率
  14. Ol3中Map事件全解析
  15. canvas--放大镜效果
  16. Excel实用技巧,超漂亮的Excel图表来了!
  17. zcmu之水题来一波~
  18. 集合转换成数组的两种方法---toArray()和toArray(T[] a)
  19. 转载:2008年不可错过的25部新剧
  20. 小程序不再小,已成为各大平台的必争之地

热门文章

  1. Windows-server-2008-R2安装Oracle-11g-R2-dataguard
  2. UVa-401-Palindromes(回文)
  3. Kotlin 的 Array 转 List
  4. [转]版本二写代码的小女孩
  5. 微信公众号--相关资料
  6. A Simple Note on P4FPGA: A Rapid Prototyping Framework for P4
  7. HTML5权威指南 11.通信API
  8. hello nodejs
  9. Android “再按一次退出“
  10. Android菜鸟如何学习Android系统开发?