zoukankan      html  css  js  c++  java
  • 找出这个列表中和为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
  • 相关阅读:
    二进制数组ArrayBuffer
    iperf3测量一个网络最大带宽
    Proxy与Reflect
    Symbol
    Iterator
    Set与Map
    Generator
    Android 共享参数 SharedPreferences
    DDMS files not found: xxxhprof-conv.exe
    Android 状态栏通知 Notification
  • 原文地址:https://www.cnblogs.com/pipile/p/12718325.html
Copyright © 2011-2022 走看看