【问题标题】:Return number of coins needed of the coin at that position in an array format以数组格式返回该位置硬币所需的硬币数量
【发布时间】:2018-10-31 18:02:15
【问题描述】:

我正在尝试返回一个数组中的硬币数量,该数量是一个数字的总和。

所以如果 m 是 143 并且 coin = [200, 100, 50, 20, 10, 5, 2, 1],那么会返回 [0, 1, 0, 2, 0, 0, 1, 1] 的意思没有 200 币、1 枚 100 币、没有 50 枚硬币、2 枚 20 币、没有 10 枚硬币、没有 5 枚硬币、1 枚 2 币和 1 枚 1 币。

现在我的解决方案返回 5,这是硬币的数量。

        def coinSplit(m):
            if m == 0:
                return 0
            for i in range(len(coin)):
                if coin[i] <= m:
                    return 1 + coinSplit(m-coin[i])

      coin = [200, 100, 50, 20, 10, 5, 2, 1]
      print(coinSplit(143))

【问题讨论】:

    标签: python algorithm list function


    【解决方案1】:

    以下迭代实现有效:

    def coinSplit(m):
        res = []
        for c in coin:
            num = m // c
            m = m % c
            res.append(num)
        return res
    
    >>> coinSplit(143)
    [0, 1, 0, 2, 0, 0, 1, 1]
    

    这假设了一个硬币池,这种贪婪的方法总是会产生结果。 如果您希望这是递归的,您可以尝试:

    def coinSplit(m, coins):
        if m == 0:
            return [0 for coin in coins]
        return [m // coins[0]] + coinSplit(m % coins[0], coins[1:])
    
    >>> coinSplit(143, [200, 100, 50, 20, 10, 5, 2, 1])
    [0, 1, 0, 2, 0, 0, 1, 1]
    

    【讨论】:

    • num, m = divmod(m, c)
    • 哇!很好的答案。我想这对你来说是一个常见的问题。对我来说,这是一件值得学习的事情。
    • @WalterTross 没错,但对于初学者来说,我更喜欢明确地使用基本运算符。
    • Style Guide for Python Code (PEP 8) 建议:“函数名称应为小写,单词之间用下划线分隔,以提高可读性。”这意味着函数的名称应该是coin_split
    • @WalterTross 我同意。但如果你不介意,我会坚持使用 OP 的命名。
    【解决方案2】:

    关键是在python中使用算术运算符。具体除法/ 和模数'%'

    通过遍历列表直到余数为零来获取商和余数。

    硬币 = [200, 100, 50, 20, 10, 5, 2, 1]

    例如:

    • 143/200 = 0; 143 % 200 = 143
    • 继续下一个,143/100 = 1; 143 % 100 = 43

    重复这个过程直到余数为零

    【讨论】:

      【解决方案3】:

      您返回所需的总硬币数量,不管它们的价值。您需要跟踪每个硬币的数量,我假设您希望创建一个与输入大小相同的列表(coin = [200, 100, 50, 20, 10, 5, 2, 1])并用零初始化它,作为其他答案,使用模数添加到正确的索引然后返回这个列表。您仍然可以将其编写为递归,但有另一个操作来添加正确的索引。

      我认为这就像一个家庭作业,所以我没有为你提供代码。我希望这有帮助。

      【讨论】:

        猜你喜欢
        • 2017-06-21
        • 1970-01-01
        • 2011-05-11
        • 1970-01-01
        • 2020-05-09
        • 1970-01-01
        • 2019-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多