【问题标题】:Get list of numbers form Array Whose sum is X [duplicate]获取总和为X的数组的数字列表[重复]
【发布时间】:2020-10-13 13:01:41
【问题描述】:

我有一个号码,比如说27 和一个NumbersList 的列表。如何从NumbersList 获得一些选定的数字,其中一些是 27。以及使用来自NumbersList 的最大数字 这可以通过抛出所有可能性来完成,但我内心深处知道有一个简单的解决方案,但我想多了。

#available numbers
NumbersList = [1,5,9,4,6,8,12,12,1,3,6,8,7,8,2]

def GetNumbers(number):
    global NumbersList
    tmpList = []

    #Some magical code

    return tmpList


#now result have
result = GetNumbers(27)
# result is  [12, 12, 3]
# 12+12+3 using most possible greater numbers from "NumbersList"

【问题讨论】:

    标签: python math


    【解决方案1】:

    你可以试试

    NumbersList = [1,5,9,4,6,8,12,12,1,3,6,8,7,8,2]
    
    def GetNumbers(number):        
        result = []
        for i in sorted(NumbersList, reverse=True):
            if sum(result) + i <= number:
                result.append(i)
        return result
    

    或者如果NumbersList 很大,那么你可以减少迭代

    def GetNumbers(number):
        result = []
        for i in sorted(NumbersList, reverse=True):
            sum_list = sum(result)
            if sum_list + i == number:
                result.append(i)
                return result
            elif sum_list + i < number:
                result.append(i)
        return result
    
    print(GetNumbers(27))
    

    输出

    [12, 12, 3]
    

    【讨论】:

    • 如何优先考虑列表末尾的数字而不是更大的数字?
    • 从排序方法中移除 reverse=True
    【解决方案2】:

    这是一种方法

    NumbersList = [1,5,9,4,6,8,12,12,1,3,6,8,7,8,2]
    
    def GetNumbers(NumbersList, number):
        tmpList = []
        summ = 0
        srtd = sorted(NumbersList)
        for i in range(len(srtd)-1, 0, -1):
            if summ + srtd[i] > number:
                break
            summ += srtd[i]
            tmpList.append(srtd[i])
        for i in range(len(NumbersList)):
            if NumbersList[i] == number - summ:
                tmpList.append(NumbersList[i])
        if sum(tmpList) == number:
            return tmpList
        else:
            return None
    
    result = GetNumbers(NumbersList, 27)
    print(result)
    

    当然不是最好的,但可以做到这一点。

    首先,您对列表进行排序,找到所有不超过限制的最大数字。然后你会找到丢失的号码。 如果有,返回数组。 如果没有,我们返回 None。

    此代码不适用于所有情况,但它是一个很好的开始。

    最简单的方法是对列表进行排序,然后向后循环,然后

    下一个号码还有空位吗?

    • 如果有,您可以将其添加到列表中。
    • 如果没有,请跳过。

    最后你应该检查你的 tmpList 的总和。它的总和有可能是 != 您的预期数字。

    【讨论】:

      猜你喜欢
      • 2021-11-20
      • 1970-01-01
      • 2021-08-08
      • 2022-07-21
      • 2021-03-14
      • 2021-01-24
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多