サンダーボルト

相手モンスターを全て破壊する。

LeetCode Study : 27. Remove Element

問題

Given an array nums and a value val, remove all instances of that value in-place and return the new length. 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 containing 0, 1, 3, 0, and 4.

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

It doesn't matter what values are set beyond the returned length.

https://leetcode.com/problems/remove-element/

自分の解答

public int removeElement(int[] nums, int val) {
    int pointerIndex = 0;
    for (int i = 0; i< nums.length; i++) {
        if (nums[i] != val) {
            nums[pointerIndex++] = nums[i];
        }
    }
    return pointerIndex;
}

コード理解

別解

public int removeElement(int[] nums, int val) {
    int i = 0;
    for (int n : nums) {
        if (n != val) {
            nums[i] = n;
            i++;
        }
    }
    return i;
}

Time :  O(n) / Space :  O(1)

まあいい感じでできたと思う。i++も別の行に書かずnumsの[]の中に入れられた。ただ、たしかに拡張for文でよかった〜 LeetCode始めた当初は最初拡張で書いて結局index必要だからと普通のに書き直してたけど最近は何も考えず普通のfor文使ってたなぁ。できるなら拡張for文にしよう。

今後のための考え方

  • 拡張for文でいけるなら拡張にしよう