banner
ekko

ekko's blog

时间不在于你拥有多少,而在于你怎样使用
github
xbox
email

Remove Element

Description#

Given an array nums and a value val, you need to remove all elements that are equal to val in-place, and return the new length of the array.

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

The order of elements can be changed. It doesn't matter what you leave beyond the new length.

Example 1:

Given nums = [3,2,2,3], val = 3,

Your function should return length = 2, with the first two elements of nums being 2.

It doesn't matter what you leave beyond the returned length.

Example 2:

Given nums = [0,1,2,2,3,0,4,2], val = 2,

Your function should return length = 5, with the first five elements of nums being 0, 1, 3, 0, 4.

Note that the order of those five elements can be arbitrary.

It doesn't matter what you leave beyond the returned length.

Note:

Why is the returned value an integer but your answer is an array?

Note that the input array is passed in by reference, which means a modification to the input array will be known to the caller as well.

Internally you can think of this:

// nums is passed in by reference. (i.e., without making a copy)
int len = removeElement(nums, val);

// any modification to nums in your function would be known by the caller.
// using the length returned by your function, it prints the first len elements.
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

Approach#

  • Similar to removing duplicates from a sorted array, but the condition is changed from duplicates to a fixed value, and the search starts from the first element. Therefore, modify the previous code slightly.
void exchange(int* num1,int* num2) {
    *num1 ^= *num2;
    *num2 ^= *num1;
    *num1 ^= *num2;
}

int removeElement(int* nums, int numsSize, int val){
    for(int now = 0,last_find = 0;;now++) {//current position
        for(int find = last_find;;find++) {//search pointer
            if(find >= numsSize)//search ends
                return now;
            if(nums[find] != val) {//find the specified element
                if(find != now)
                    exchange(nums+now,nums+find);
                last_find = find + 1;//next search starts from the next element
                break;
            }
        }
    }
}
Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.