[[1,3,2], [1,2,3], [2,1,3], [2,3,1], [3,1, -6ren">
gpt4 book ai didi

尽管记录的值有数字,但 Javascript 从 "push"操作返回稀疏数组

转载 作者:行者123 更新时间:2023-11-30 14:26:20 24 4
gpt4 key购买 nike

我正在研究我的回溯算法技能,但我遇到了一个问题。问题是生成不同整数数组的所有排列,即置换([1,2,3]) => [[1,3,2], [1,2,3], [2,1,3], [2,3,1], [3,1, 2], [3,2,1]]

我有这样写的:

var permute = function(nums) {
var backtrack = function(nums, chosen, solutions) {
if (chosen.length === nums.length) {
// I'm not mutating nums.length so I don't get why this is pushing on empty arrays
console.log(chosen);
solutions.push(chosen);
} else {
for (let i = 0; i < nums.length; i++) {
if (!chosen.includes(nums[i])) {
chosen.push(nums[i]);
backtrack(nums, chosen, solutions);
chosen.pop();
}
}
}
}
var chosen = [];
var solutions = [];
backtrack(nums, chosen, solutions);
return solutions;
}

当我注销第 5 行的 chosen 数组变量时,它有 4 个值,如我所料。但是,我注意到 Javascript 声称它有 4 个值,但长度属性为零。这意味着当我运行函数 permute([1,2,3]) 时,我得到的结果是 [[], [], [], [], [], []] 或 nums.length 稀疏数组的阶乘数。我怀疑我的循环是问题所在,我没有完全理解我传递的所有这些数组引用,但我不确定还能做什么。注销 chosen 是我所期望的。感谢任何帮助或进一步阅读。

这并非特定于 Chrome 控制台环境。如果我在节点 repl 中运行它,我会看到相同的行为。

最佳答案

你改变了相同的数组选择。要推送结果,您可以添加 chosen 数组的副本。

solutions.push(chosen.slice());

部分

for (let i = 0; i < nums.length; i++) {
if (!chosen.includes(nums[i])) {
chosen.push(nums[i]);
backtrack(nums, chosen, solutions);
chosen.pop();
}
}

迭代 nums 的所有元素并检查该值是否已在 chosen 中。如果不是,则将该值插入数组 chosen。然后回溯发生,在此之后,chosen 的最后一个值被删除。

最后,chosen是一个空数组,是同一个数组/对象引用压入的结果。

结果,您获得了正确数量的项目 (6),但始终是相同的空数组。

var permute = function(nums) {
var backtrack = function(nums, chosen, solutions) {
if (chosen.length === nums.length) {
// I'm not mutating nums.length so I don't get why this is pushing on empty arrays
//console.log(chosen);
solutions.push(chosen.slice());
} else {
for (let i = 0; i < nums.length; i++) {
if (!chosen.includes(nums[i])) {
chosen.push(nums[i]);
backtrack(nums, chosen, solutions);
chosen.pop();
}
}
}
}
var chosen = [];
var solutions = [];
backtrack(nums, chosen, solutions);
return solutions;
}

console.log(permute([1, 2, 3]));
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于尽管记录的值有数字,但 Javascript 从 "push"操作返回稀疏数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51889714/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com