상세 컨텐츠

본문 제목

Array101 Remove Element

Go/Leet Code

by Gopythor 2022. 3. 15. 19:47

본문

728x90
반응형

Accepted Solutions Runtime Distribution
Accepted Solutions Memory Distribution

Given an integer array nums and an integer val, remove all occurrences of val in nums in-place. The relative order of the elements may be changed.

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 val = ...; // Value to remove
int[] expectedNums = [...]; // The expected answer with correct length.
                            // It is sorted with no values equaling val.

int k = removeElement(nums, val); // Calls your implementation

assert k == expectedNums.length;
sort(nums, 0, k); // Sort the first k elements of nums
for (int i = 0; i < actualLength; i++) {
    assert nums[i] == expectedNums[i];
}

If all assertions pass, then your solution will be accepted.

Example 1:

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

Example 2:

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

Constraints:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100

My code

func removeElement(nums []int, val int) int {
    if len(nums) == 0 {
        return 0
    }

    i, j := 0, len(nums)-1
    for i <= j {
        if nums[j] == val {
            j--
        } else {
            nums[i], nums[j] = nums[j], nums[i]
            i++
        }

    }
    return i
}
  • When nums length is 0, then return 0.
  • First I implemented i as increment with if condition.
  • But i think that will inefficient when If j(end of array) has value which wants to remove.
  • So I changed i to j if condition.
  • But I wanted to quit when i and j are same, I need to check later.

Modification

func removeElement(nums []int, val int) int {
    i := 0
    for _, v := range nums {
        if v != val {
            nums[i] = v
            i++
        }
    }
    return i
}
  • Suddenly this code pops into my mind.
  • So simple.

sample 0 ms submission & sample 2100 KB submission

func removeElement(nums []int, val int) int {
    slow:= 0
    for fast := 0; fast < len(nums); fast++ {
        if nums[fast] != val {
            nums[slow]=nums[fast]
            slow++
        }
    }
    return slow
}
  • I think this is simple code.
  • Slow will be used also as counter because it increase when swift happens.
  • Fast will be go to End of array.

sample 2 ms submission

func removeElement(nums []int, val int) int {
  k := 0
  for i, n := range nums {
    if (n != val) {
      if (i != k) {
        nums[k] = n
      }
      k++
    }
  }
  return k
}
  • This include more if condition when value array is same with write pointer(k).
  • I don't think it is necessary but code will be more correctly working.

sample 2000 KB submission && 0 ms submission

func removeElement(nums []int, val int) int {
    numsLen := len(nums)
    var result int

    if numsLen == 1 {
        if nums[0] == val {
            return 0
        }

        return 1
    }

    // constraint 0 <= nums.length <= 100 && 0 <= val <= 100
    if numsLen >= 0 && numsLen <= 100 && val >= 0 && val <= 100 {

        k := numsLen - 1
        i := 0

        for i <= numsLen && k >= 0 {

            if nums[k] == val {
                k--
            } else {
                //swap them
                if nums[i] == val {
                    temp := nums[i]
                    nums[i] = nums[k]
                    nums[k] = temp
                    k--
                } else {
                    i++
                }
            }

            if i == k && nums[i] != val {
                result = i+1
                break
            }            
        }
    }

    return result
}
  • First, this code process len 1 array and checks it has value or not.
  • If it has, return 0.
  • Second, for loop will continue until i will be bigger than numsLen and K is bigger than 0.
  • K is end of array(RP). when k point value, then it decrease.
  • If not, when i has val which need to be removed, then swap.
  • I don't think i value should be in temp. It will be wasting.
  • When i saw last if condition, this code is not simple.

Modification

func removeElement(nums []int, val int) int {
    numsLen := len(nums)
    var result int

    if numsLen == 1 {
        if nums[0] == val {
            return 0
        }

        return 1
    }

    // constraint 0 <= nums.length <= 100 && 0 <= val <= 100
    if numsLen >= 0 && numsLen <= 100 && val >= 0 && val <= 100 {

        k := numsLen - 1
        i := 0

        for i <= numsLen && k >= 0 {

            if nums[k] == val {
                k--
            } else {
                //swap them
                if nums[i] == val {
                    nums[i] = nums[k]
                    k--
                } else {
                    i++
                }
            }

            if i == k && nums[i] != val {
                result = i+1
                break
            }            
        }
    }

    return result
}
728x90
반응형

관련글 더보기

댓글 영역