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

Я пытаюсь решить следующую проблему с leetcode в JS: Проблема MoveZeroes

Задача состоит в следующем: Для массива nums написать функцию, чтобы переместить все 0 до конца, сохраняя относительный порядок ненулевых элементов.

1. Вы должны сделать это на месте, не создавая копию массива.

2.Сведите к минимуму общее количество операций.

Пример:

Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

В моем коде я получаю желаемый вывод на консоли прямо перед концом функции, но это меня отвергают, и я хотел бы понять, почему.

Это мой код:

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */

var moveZeroes = function(nums) {
    let i = 0
    let length = nums.length
    while (i < length){
        if(nums[i] === 0) {
            nums = nums.slice(0, i).concat(nums.slice(i+1),0)
            length--
            continue;
        }
        length--
        i++
    }
    console.log(nums) //logs the desired result
};

Я видел подобные вопросы:

  1. Использование сращивания

  2. Этот не делает это на месте

  3. Не делать это на месте либо

Итак, я понимаю, что это может быть дубликатом, но я был бы признателен за прямой отзыв о моем коде , Спасибо!

Ответы [ 3 ]

1 голос
/ 04 апреля 2020

ваш код нарушает первое правило:

Вы должны сделать это на месте, не создавая копию массива

slice () и concat () оба возвращают новый массив, что означает копирование исходного массива;

вы можете использовать shift (), unshift (), sort () ... или поменять местами значения элементов, которые изменяют исходный массив

0 голосов
/ 04 апреля 2020

Как уже упоминалось, использование Array.slice(...) и Array.concat(...) нарушает ограничения вопроса. Цитирование некоторых отдельных разделов на страницах Mozilla Developer Network по каждой из этих функций:

  • Array.slice(...): «Метод slice () возвращает поверхностную копию части массива в новый объект массива ... "
  • Array.concat(...):" Метод concat () используется для объединения двух или более массивов. Этот метод не изменяет существующие массивы, но вместо этого возвращает новый массив . [выделение добавлено] "

Я бы весьма рекомендовал использовать для этого Array.splice(start[, deleteCount[, ... itemsToInsert]]), который можно использовать не только для удаления подразделов массив, но также для вставки новых элементов в массив, все это при изменении массива на месте. Эта универсальность позволяет Array.splice(...) функционировать как замена на месте для Array.concat() и Array.slice().

0 голосов
/ 04 апреля 2020

nums = nums.slice(0, i).concat(nums.slice(i+1),0)

В этой строке переменная nums назначается новому массиву с требуемым содержимым. Но исходный массив остается неизменным.

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