Удалить дубликаты из отсортированного массива — я не понимаю, почему мое решение не работает в определенной ситуации

#javascript

#javascript

Вопрос:

Я пытаюсь решить вопрос Leetcode «Удалить дубликаты из отсортированного массива». Но мое решение работает только в определенной ситуации. Я пытался отладить его, просматривая результат на Quokka.js . Но я все еще не могу понять, «ПОЧЕМУ» я получаю странный результат на myArr2. Кто-нибудь может помочь глупому человеку?? Спасибо заранее.

Мое решение

     let myArr = [0, 0, 1, 1, 2, 2];
    let myArr2 = [0, 0, 1, 1, 1, 2, 2, 3, 3, 4];
    
    const removedDuplicates = (nums) => {
      let k;
      for (let i = 0; i < nums.length; i  ) {
        console.log("nums: ", nums);
        console.log(nums.length);
        //       console.log("I'm I: ",i);
        if (nums[i] == nums[i   1]) {
          nums.splice(nums[i   1], 1);
          console.log("after ", i   1, " iteration nums: ", nums);
        }
      }
    
      k = nums.length;
      return k;
    };

    console.log(removedDuplicates(myArr)); // [0,1,2] 
    console.log(removedDuplicates(myArr2)); // [0,1,2,3,3,4] ... Why is "3" still in the array?? 

Ниже приведена проблема, или вы можете проверить проблему здесь

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

Поскольку на некоторых языках невозможно изменить длину массива, вместо этого вы должны поместить результат в первую часть массива nums . Более формально, если после удаления дубликатов осталось k элементов, то первые k элементов nums должны содержать конечный результат. Не имеет значения, что вы оставляете за пределами первых k элементов.

Верните k после размещения конечного результата в первых k слотах чисел.

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

Пользовательский судья:

Судья проверит ваше решение с помощью следующего кода:

int[] nums = […]; // Входной массив int[] expectedNums = […]; // Ожидаемый ответ с правильной длиной

int k = removeDuplicates(nums); // Вызывает вашу реализацию

assert k == expectedNums.length; for (int i = 0; i < k; i ) { assert nums[i] == expectedNums[i]; } Если все утверждения пройдут, ваше решение будет принято.

Пример 1:

Ввод: nums = [1,1,2] Вывод: 2, nums = [1,2,_] Объяснение: ваша функция должна возвращать k = 2, причем первые два элемента nums равны 1 и 2 соответственно. Не имеет значения, что вы оставляете за пределами возвращаемого k (следовательно, они являются символами подчеркивания). Пример 2:

Ввод: nums = [0,0,1,1,1,2,2,3,3,4] Вывод: 5, nums = [0,1,2,3,4,,,,,_] Пояснение: ваша функция должна возвращать k = 5, причем первые пять элементов nums равны 0, 1, 2, 3 и 4 соответственно. Не имеет значения, что вы оставляете за пределами возвращаемого k (следовательно, они являются символами подчеркивания).

Ограничения:

0 <= nums.длина <= 3 * 104 -100 <= nums[i] <= 100 nums сортируется в порядке неубывания.

Комментарии:

1. Вероятно, из-за того, что вы вносите изменения на месте, вы удаляете элементы во время итерации, поэтому вы можете пропустить некоторые индексы

2. Выполняйте свой код шаг за шагом с помощью отладчика

Ответ №1:

Это касается типа значения и ссылочного типа. Вы пытаетесь удалить число из массива nums, которое также влияет на исходный массив. Вот мой код на Python, который вы можете проверить:

 def removeDuplicates(self, nums: List[int]) -> int:
        expectedItem = nums[:]
        myarr = []
        for i in range(len(expectedItem)):
            if expectedItem[i] not in myarr :
                myarr.append(expectedItem[i])
            else:
                nums.remove(expectedItem[i])
        
        return len(nums);