【发布时间】:2020-12-17 06:06:22
【问题描述】:
我尝试解决leetcode 46. JS中的排列,但是下面的代码得到错误的结果,但是当使用res.push([...track])而不是res.push(track)时会是正确的。我对此感到困惑,在我看来,这两个是相同的。谢谢!
var permute = function(nums) {
const res = []
backtrack(res, [], nums)
return res
};
var backtrack = function(res, track, nums) {
if (track.length == nums.length) {
console.log('track: ', track)
console.log('res: ', res)
console.log()
res.push(track)
//res.push([...track])
return
}
for (let i = 0; i < nums.length; i++) {
if (track.includes(nums[i])) continue
track.push(nums[i])
backtrack(res, track, nums)
track.pop()
}
}
const res = permute([1,2,3])
console.log(res)
【问题讨论】:
-
执行
[...track]将轨道数组的副本推送到res,仅推送track会推送track的引用,这意味着res内的每个track都在引用到内存中的同一个数组 -
顺便说一句,您在这里做了一些标榜惯例/最佳实践的事情:1) 省略分号,2) 将
var与let/const混合到代码中,和 3) 将带有function声明的匿名函数分配给命名变量(更惯用的替代方法是使用命名函数或分配 lambda/fat-arrow 函数 (() => {})
标签: javascript push destructuring