Почему мой вывод пустой, когда я конвертирую набор в массив? - PullRequest
0 голосов
/ 05 августа 2020

Я решаю Leetcode 26 Удалить дубликаты из отсортированного массива со следующими инструкциями:

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

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

Мое решение заключалось в том, чтобы сначала создать набор, перебрать каждое число в массиве и добавить каждое в набор и просто преобразовать набор в массив.

var removeDuplicates = function(nums) {
  let set = new Set();
  for (let num of nums) {
    set.add(num);
  }
  return Array.from(set); 
};

Когда я console.log мой массив, он выводит ответ, который ищет Leetcode, но когда я отправляю, вывод будет []. Почему это происходит?

Ответы [ 4 ]

1 голос
/ 05 августа 2020

Чтобы ответить на основной вопрос, вам лучше использовать set.values(), чтобы получить все значения из набора, например,

return [...set.values()]

Но, как вы заявили, создание нового набора потребует дополнительной памяти и нарушит O ( 1) память; Простым решением было бы перебрать элементы и сохранить предыдущий элемент в переменной, если текущий элемент равен предыдущему элементу, удалить текущий элемент. Затем вернуть длину массива в конце

0 голосов
/ 05 августа 2020

Можно сделать что-то вроде этого

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

nums =[0,0,1,1,1,2,2,3,3,4];

console.log("Count :",removeDuplicates(nums),nums)

0 голосов
/ 05 августа 2020

Вы можете использовать метод сокращения и вернуть длину массива.

var removeDuplicates = function (nums) {
  return nums.reduce(function (accumulator, currentValue) {
    if (accumulator.indexOf(currentValue) === -1) {
      accumulator.push(currentValue);
    }
    return accumulator;
  }, []).length;
};

Или другой подход с использованием набора

var removeDuplicates = function (nums) {
    return [...new Set(nums)].length
}
0 голосов
/ 05 августа 2020

Очевидно, создание set нарушает инструкцию, согласно которой я должен изменить входной массив на месте с помощью дополнительной памяти O (1).

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