找出这个列表中和为13的两个数字的所有组合

解法一:

超级大循环

最容易想到的就是遍历啊。嵌套循环,外层循环遍历全部列表,内层循环遍历当前元素位置之后的所有元素。内层循环中将两个数字相加,等于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

 2022/09/06:自己的方法

>>> def func(data):
...     data_len=len(data)
...     for i in range(data_len-1):
...             for j in range(i+1,data_len):
...                     if data[i]+data[j]==13:
...                             print("{}+{}=13".format(data[i],data[j]))
...

 

posted @ 2020-04-17 10:44  pple  阅读(269)  评论(0编辑  收藏  举报
以终为始,你期待的那天不会太遥远。