Leetcode 322:用 2 种编程语言找硬币会产生 2 种不同的结果
Posted
技术标签:
【中文标题】Leetcode 322:用 2 种编程语言找硬币会产生 2 种不同的结果【英文标题】:Leetcode 322: Coin change with 2 programming languages produces 2 different results 【发布时间】:2022-01-14 10:20:43 【问题描述】:我正在尝试解决Leetcode Problem 322。这是网站上引用的描述。
给你一个整数数组coins,表示不同面额的硬币,一个整数表示总金额。
返还您需要的最少数量的硬币来弥补该金额。如果该金额不能由任何硬币组合弥补,则返回-1。
您可以假设您拥有无限数量的每种硬币。
我已经编写了 2 个递归解决方案,1 个用 Python 编写,1 个用 javascript 编写。出于某种原因,Javascript 中的那个不会为相同的输入生成正确的值,而 Python 中的那个总是这样。
想问一下是否有人知道导致输出差异的原因。我尝试了以下测试用例:
coins = [1,2,5], amount = 11 => Expected: 3
coins = [1,2], amount = 2 => Expected: 1
这是我用各种语言编写的代码。
Javascript
var coinChange = function(coins, amount)
coins = coins.sort((a,b) => b -a )
ans = helper(coins, amount, 0)
if (ans >= Number.MAX_VALUE)
return -1
return ans;
;
function helper(coins, amount, pos)
if (pos >= coins.length || amount < 0)
return Number.MAX_VALUE;
else if (amount === 0)
return 0;
left = helper(coins, amount - coins[pos], pos) + 1
right = helper(coins, amount, pos + 1)
return Math.min(left, right)
使用上面两个测试用例,两个测试用例都错了。
coins = [1,2,5], amount = 11 => Expected: 3, gets 2
coins = [1,2], amount = 2 => Expected: 1, gets 2
Python
def coinChange(coins, amount):
coins = sorted(coins, reverse = True)
ans = helper(coins, amount, 0)
if (ans >= float("inf")):
return -1
return ans
def helper(coins, amount, pos):
if (pos >= len(coins) or amount < 0):
return float("inf")
elif (amount == 0):
return 0
left = helper(coins, amount - coins[pos], pos) + 1
right = helper(coins, amount, pos + 1)
return min(left, right)
使用上述 2 个测试用例,两个测试都正确。
coins = [1,2,5], amount = 11 => Expected: 3, gets 3
coins = [1,2], amount = 2 => Expected: 1, gets 1
【问题讨论】:
你试过调试你的代码吗? What is a debugger and how can it help me diagnose problems? 和 How to debug small programs 是的,在发布这个问题之前,我已经使用print
调试进行了一些调试。会认为 javascript 代码中的递归树存在问题,但无法验证可能是什么原因。令人惊讶的是,Python 等效项有效,因此想在这里检查 Javascript 代码中的错误是否是由于 Javascript 特定的原因造成的
问题是你没有声明你的变量。它们都是隐式全局变量。因此,所有递归执行都使用相同的数据并将其混合在一起。
@VLAZ 感谢您的大提示,在我最初尝试调试时没有注意到这一点
【参考方案1】:
Javascript 代码通过将 let 添加到每个递归调用的返回值来获得预期的答案。
例如left = helper(coins, amount - coins[pos], pos) + 1
改为
let left = helper(coins, amount - coins[pos], pos) + 1
【讨论】:
以上是关于Leetcode 322:用 2 种编程语言找硬币会产生 2 种不同的结果的主要内容,如果未能解决你的问题,请参考以下文章