Удалить дубликаты из отсортированного массива и вернуть длину - необходимо изменить исходный массив - PullRequest
1 голос
/ 27 марта 2020

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ

Мне хорошо известны дублирующие вопросы, однако этот вопрос просит удалить дубликаты без создания нового массива и хочет, чтобы мы мутировали исходный массив.

ИНСТРУКЦИИ

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

Не выделяйте дополнительное пространство для другого массива, вы должны сделать это путем изменения входного массива на месте с помощью O (1) дополнительной памяти.

ПРИМЕР

Учитывая nums = [1,1,2],

Ваша функция должна возвращать length = 2, причем первые два элемента nums равны 1 и 2 соответственно.

Это не ' не имеет значения, что вы оставите после возвращенной длины.

ПОПЫТКА

const removeDuplicates = function(nums) {

   for(let i of nums){
     if(nums[i] === nums[i]){
        nums.splice(i, 1)
     }
   }
   return nums.length;
};

console.log(removeDuplicates([1, 1, 2]));
console.log(removeDuplicates([1, 2]));

// [1, 1, 2] => [1, 2] (Correct)
// [1, 2]    => [1]    (Incorrect - should be [1, 2])

Правильно ли я мутировал массив с помощью сплайсинга и что мне нужно сделать, чтобы исправить второй аргумент?

Кроме того, в leetcode, когда я запускаю первый аргумент говорит, что это правильно, и возвращает массив оставшихся элементов, но в инструкциях запрашивалась длина нового массива. Не уверен, что я что-то упустил, но почему он не возвращает длину?

https://imgur.com/5cuhFYf

Ответы [ 4 ]

1 голос
/ 27 марта 2020

Подсказка в строке: It doesn't matter what you leave beyond the returned length.

Тот, кто спрашивает вас об этом, хочет, чтобы вы двигались по массиву, отслеживая 2 указателя: 1) конец выходного массива и 2) текущий индекс во входном массиве.

Если вы сделаете это и скопируете входные данные в выходной указатель только тогда, когда они различаются, вы получите правильный вывод, правильную длину (из выходного указателя) и немного мусора в конце массива.

const unique = (arr) => {
  let output = 0;
  for (let input = 0; input < arr.length; input++) {
    if (arr[output] !== arr[input]) {
      output++;
      arr[output] = arr[input];
    }
  }
  return output + 1;
}

const arr = [1, 1, 2, 3, 3, 3, 4, 5, 5, 6, 8, 8, 8, 9, 11];
const length = unique(arr);
console.log(arr, length);
1 голос
/ 27 марта 2020

Для каждого элемента массива вам нужно пройти через все оставшиеся элементы этого массива, чтобы проверить все дубликаты. Не уверен, что это более эффективно, чем копирование.

const removeDuplicates = function (nums) {
    let i = 0;
    while (i < nums.length) {
        let j = i + 1;
        while (j < nums.length) {
            if (nums[i] === nums[j]) {
                nums.splice(j, 1);
            }
            else {
                j++;
            }
        }
        i++;
    }
    return nums.length;
};
console.log(removeDuplicates([1, 1, 2]));
console.log(removeDuplicates([1, 2]));
console.log(removeDuplicates([1, 2, 1, 3, 4, 3, 2, 1]));

// [1, 1, 2] => [1, 2] (Correct)
// [1, 2]    => [1]    (Incorrect - should be [1, 2])
// [1, 2, 1, 3, 4, 3, 2, 1] => [1, 2, 3, 4]
1 голос
/ 27 марта 2020

Вот вы:

const removeDuplicates = function(nums) {

   for(let i = 0; i < nums.length;){
     if(nums[i] === nums[++i]){
        nums.splice(i, 1)
     }
   }
   return nums.length;
};

console.log(removeDuplicates([1, 1, 2]));
console.log(removeDuplicates([1, 2]));
1 голос
/ 27 марта 2020

let nums = [1,1,2];
nums = [...new Set(nums)].length;
console.log(nums);
nums = [1,1,2];
nums = nums.filter(function(item, pos, self) {
  return self.indexOf(item) == pos;
})
console.log(nums)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...