Почему этот код возвращает пустой массив? - PullRequest
0 голосов
/ 19 января 2020

Вопрос: Учитывая набор различных целых чисел, вернуть все возможные перестановки.

Пример: Ввод: [1,2,3]

Желаемый вывод: [[1,2,3 ], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]

Aren ' массивы, переданные по ссылке в 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]));

Ответы [ 2 ]

2 голосов
/ 19 января 2020

Вы только когда-либо создаете один массив cur, когда вызываете helper:

helper(nums, result, []);

, который вы продолжаете мутировать и рекурсивно передаете в helper. В памяти только один массив; к концу вы .pop воспроизводите последний элемент из массива, и каждый элемент в массиве result ссылается на один и тот же объект, теперь пустой массив cur.

Вместо этого клонируйте cur внутри l oop, поэтому, когда / если он выдвигается, вы нажимаете новый массив, а не ссылку на старый, который будет использоваться везде:

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]));
0 голосов
/ 19 января 2020

Нет, все в JavaScript передается по значению. В вашей функции helper будет создана локальная переменная result, которой будет присвоено значение аргумента при вызове helper. Скорее всего, вы хотите: result = helper(nums, result, []);.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...