Зачем переменной j нужно присваивать на каждой итерации для моего решения javascript bruteforce значение twoSum?

#javascript #node.js #algorithm

Вопрос:

Итак, я решил проблему twoSum, которую вы можете найти здесь: twoSum и я знаю, что есть лучшие и более эффективные решения, но для этого я просто пытаюсь понять, почему я получаю пустой массив, если я не переназначу переменную j внутри цикла while. См. Код ниже. Когда я попытался решить эту проблему, назначив j вне цикла, это не сработало. См.Комментарии к коду.

Мой ответ на полпути/первоначальная мысль заключалась в том, что, присваивая значение j вне цикла, он выполняет прямое присвоение по значению, что означает, что его значение не меняется, поскольку интерпретатор работает только сверху вниз и фактически не возвращается для проверки. Таким образом, это означало бы, что если бы j был назначен по ссылке, эта проблема не возникла бы?? Я не знаю, на правильном ли я пути

 var twoSum = function (nums, target) {
  let indecesArr = [];
  let i = 0;
  //j declaration without assignment
  let j;
  //let j = i   1; //this will cause return to be empty array
  

  while (i < nums.length) {
    //j's value has to be reassigned here otherwise return is an empty [] array
      j = i   1;
    while (j < nums.length) {
      if (nums[i]   nums[j] === target) {
        indecesArr.push(i, j);
      }
      j  ;
    }
    i  ;
  }

  return indecesArr;
};

console.log(twoSum([3, 2, 4], 6)); //output [1,2]
 

Ответ №1:

Вы увеличиваете значение j во внутреннем цикле while.

Поэтому, когда i =0, что означает числа[i] = 3, тогда j увеличивается до самого конца, так как у них нет совпадающей пары. Поэтому в следующий раз, когда i = 1 и так далее, j уже прошел до конца массива. Код внутри второго цикла никогда не выполняется с i=1,следовательно, нет совпадающей пары