简体   繁体   中英

Remove Duplicates from Sorted Array - I don't understand why my solution doesn't work in certain situation

I'm trying to solve a Leetcode question "Remove Duplicates from Sorted Array" . But my solution only works on certain situation. I've tried to debug it looking through the result on Quokka.js. But I can't still understand "WHY" I get the weird result on myArr2. Anyone can help a stupid person?? Thx in advance.

My solution is

 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??

Below is the problem or you can check the problem here

Given an integer array nums sorted in non-decreasing order, remove the duplicates in-place such that each unique element appears only once. The relative order of the elements should be kept the same.

Since it is impossible to change the length of the array in some languages, you must instead have the result be placed in the first part of the array nums. More formally, if there are k elements after removing the duplicates, then the first k elements of nums should hold the final result. It does not matter what you leave beyond the first k elements.

Return k after placing the final result in the first k slots of nums.

Do not allocate extra space for another array. You must do this by modifying the input array in-place with O(1) extra memory.

Custom Judge:

The judge will test your solution with the following code:

int[] nums = [...]; // Input array int[] expectedNums = [...]; // The expected answer with correct length

int k = removeDuplicates(nums); // Calls your implementation

assert k == expectedNums.length; for (int i = 0; i < k; i++) { assert nums[i] == expectedNums[i]; } If all assertions pass, then your solution will be accepted.

Example 1:

Input: nums = [1,1,2] Output: 2, nums = [1,2,_] Explanation: Your function should return k = 2, with the first two elements of nums being 1 and 2 respectively. It does not matter what you leave beyond the returned k (hence they are underscores). Example 2:

Input: nums = [0,0,1,1,1,2,2,3,3,4] Output: 5, nums = [0,1,2,3,4, , , , ,_] Explanation: Your function should return k = 5, with the first five elements of nums being 0, 1, 2, 3, and 4 respectively. It does not matter what you leave beyond the returned k (hence they are underscores).

Constraints:

0 <= nums.length <= 3 * 104 -100 <= nums[i] <= 100 nums is sorted in non-decreasing order.

This is the case of Value Type and Reference Type. You are trying to remove the number from nums array which also affect the original array. Here's my code in Python you can check:

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM