javascript - 为什么这段代码返回一个空数组?
问题描述
问题:给定一个不同整数的集合,返回所有可能的排列。
示例:输入:[1,2,3]
所需输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1 ]]
JavaScript 中的数组不是通过引用传递的吗?为什么我返回结果数组时为空?
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permute = function(nums) {
var result = [];
helper(nums, result, []);
return result;
};
var helper = function(nums, result, cur) {
if (cur.length == nums.length) {
result.push(cur);
} else {
for (let i = 0; i < nums.length; i++) {
cur.push(nums[i]);
helper(nums, result, cur);
cur.pop();
}
}
}
console.log(permute([1, 2, 3]));
解决方案
当您调用时,您只会创建一个cur
数组helper
:
helper(nums, result, []);
您继续变异并递归地传递helper
. 内存中只有一个数组;到最后,您已经.pop
ped 了数组中的最后一项,并且数组中的每个项都result
指向同一个对象,即现在为空的cur
数组。
相反,cur
在循环内克隆,以便当/如果它被推送时,您正在推送一个新数组,而不是对旧数组的引用,它将在任何地方重用:
for (let i = 0; i < nums.length; i++) {
const temp = cur;
cur = [...cur, nums[i]]; // Similar to `.push`, except it creates a new array
helper(nums, result, cur);
cur = temp; // Similar to `.pop` - reverts the array to what it was originally
}
var permute = function(nums) {
var result = [];
helper(nums, result, []);
return result;
};
var helper = function(nums, result, cur) {
if (cur.length == nums.length) {
result.push(cur);
} else {
for (let i = 0; i < nums.length; i++) {
const temp = cur;
cur = [...cur, nums[i]]; // Similar to `.push`, except it creates a new array
helper(nums, result, cur);
cur = temp; // Similar to `.pop` - reverts the array to what it was originally
}
}
}
console.log(permute([1, 2, 3]));
推荐阅读
- android - Leanback Search 片段在关注结果后关闭
- wordpress - 无效范围:publish_actions、manage_pages、publish_pages、user_managed_groups、user_posts、user_photos
- swift - 带有 TableView 的 Swift 4 SegmenterControl
- spring - Spring Boot / Kafka Json 反序列化 - 受信任的软件包
- angular - 如何为 AuthService 类注册方法编写统一测试
- android - Firebase AuthInstance.currentUser 成功重新加载后为空
- python - 如何在 sphinx 中使用 WebSupport.Build 构建文档时删除构建缓存?
- java - 如何正确遍历 Nat 表中的单元格?
- powerbi - Power BI 中“折线图和堆积柱形图”中的值小数冲突
- python - 我是否必须在 python 中重新加载模块才能捕获更改?