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

列表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:
            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种情况:

1、等于S,那就将这两个数字添加的结果列表中,l指针右移,r指针左移

2、小于S, 将l指针右移

3、大于S, r指针左移

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==

时间: 2024-12-24 21:09:33

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

python算法题 python123网站单元四题目

目录 一:二分法求平方根 二:Collatz猜想 三:算24(只考虑满足,不考虑把所有情况找出来) ??下面向大家介绍几个python算法题. 一:二分法求平方根 1.题目要求为 2.输入输出格式为 3.博主解题的思路 ??这道题在c语言中是一道经典的题目,可以用循环,或者递归,在这里我们用python来写.无论是循环还是递归,都是下面的思路: ??二分法就是从中间开始取,把我们每次的结果的变化值(这里是平方)和初始数值对比,然后分别从左右两边截取. ??这里首先设定两个范围定界符low与hig

[经典算法题]寻找数组中第K大的数的方法总结

[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26 字体:[大 中 小] 打印复制链接我要评论 今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以下的方式,决定很好,推荐给大家. 所谓"第(前)k大数问题"指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题.

算法题——翻转链表中的一段

题目:给出一个链表中的两个指针p1和p2,将其之间的结点翻转. 思路:可以通过交换结点内的值来实现结点的翻转,空间为O(N):如果要求不能交换值,那么仅凭p1和p2是无法翻转的,只能交换两个指针之间的链表. 代码: 交换值: 1 struct ListNode 2 { 3 int val; 4 ListNode *next; 5 }; 6 7 void reverseNodes(ListNode *p1, ListNode *p2) { 8 if ( p1 == NULL || p2 == NU

我的Android进阶之旅------&gt;Android【设置】-【语言和输入法】-【语言】列表中找到相应语言所对应的列表项

今天接到一个波兰的客户说有个APP在英文状态下一切运行正常,但是当系统语言切换到波兰语言的时候,程序奔溃了.所以首先我得把系统的语言切换到波兰语,问题是哪个是波兰语呢? 我还真的不认识哪个列表项代表着波兰语.如下图所示:进入到[设置]-[语言和输入法]-[语言]列表后,我就傻眼了,哪个是波兰语呢?本文将介绍如何在列表中找到相应语言所对应的列表项. ([Settings]-[Language & input]-[Language]) 哪个是波兰语呢?好吧,我只认识 日本语.中文.英语的几项,其他的

ip列表中找到具体某个ip的所有访问日志并生成对应的文件

#!/bin/sh # 功能:从ip列表中找到具体某个ip的所有访问日志并生成对应的文件 #      # mkdir  handle > com.ip.txt function handle(){         #echo "egrep "$1"  0602.log  > handle/$n.txt"         egrep "$1"  0602.log  > handle/$1.txt         time=`wc

算法题1 数组中唯一出现1次的数|唯一出现2次的数

题目描述:一个整型数组里除了1个数字之外,其他的数字都出现了两次,请写程序找出这个只出现一次的数字.要求时间复杂度是 O(n),空间复杂度是 O(1),例如输入数组{2, 4, 3, 3, 2, 5 },因为只有 4 这个数字只出现一次,其他数字都出现了两次,所以输出 4 思路分析:本题以及延伸题目,在剑指offer上有详细描述.利用异或的特性,x^y^x=y^x^x=y.对数组所有元素一次进行异或操作,最终得到的值就是那个只出现一次的数字 代码 1 int FindOnceNum(int ar

《剑指offer》第五十六题I:数组中只出现一次的两个数字

// 面试题56(一):数组中只出现一次的两个数字 // 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序 // 找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). #include <cstdio> unsigned int FindFirstBitIs1(int num); bool IsBit1(int num, unsigned int indexBit); void FindNumsAppearOnce(int data[], int

IT公司100题-14-排序数组中和为给定值的两个数字

问题描述: 输入一个升序排序的数组,给定一个目标值target,求数组的两个数a和b,a+b=target.如果有多个组合满足这个条件,输出任意一对即可. 例如,输入升序数组[1, 3, 4, 5, 13, 17]和目标值20.输出3和17. 分析: 最简单的办法,直接遍历,时间复杂度为O(n^2). 双下标法:low和high a[low]+a[high] < target, low++; a[low]+a[high] > target, high–; a[low]+a[high] == t

73. 数组中只出现一次的两个数字

异或运算,看视频吧.AcWing 73. 数组中只出现一次的两个数字 https://www.acwing.com/solution/acwing/content/1324/ 假设这2个数为x,y 1.对所有数进行异或,相同的2个数执行异或后的值为0.结果就是x⊕y. 2.异或运算的性质:.若a是二进制数0101,b是二进制数1011:则a⊕b=1110 ,只有在两个比较的位不同时其结果是1,否则结果为0. 可以肯定的是,x⊕y的结果有某一位k是1.利用第k位是1,将数组分成2类数组,数组m是Z