Zenn
📝

27. Remove Element

2025/03/15に公開
整数配列 nums と整数 val が与えられた場合、nums 内のすべての val の出現をインプレースで削除してください。要素の順序は変更されても構いません。その後、val とは異なる要素の数を返してください。

実装で必要なこと
nums 配列を変更し、最初の k 個の要素に val ではない要素を配置する。
配列の残りの要素とサイズは重要ではありません。
k を返す。

カスタムジャッジ (Custom Judge)
ジャッジは次のコードで解答をテストします。

int[] nums = [...]; // 入力配列
int val = ...; // 削除する値
int[] expectedNums = [...]; // 正しい長さの期待される結果
                            // val と等しい値は含まれていない

int k = removeElement(nums, val); // 実装した関数を呼び出す

assert k == expectedNums.length;
sort(nums, 0, k); // nums の最初の k 要素をソート
for (int i = 0; i < k; i++) {
    assert nums[i] == expectedNums[i];
}
すべてのアサーションが通れば、解答は正しいと判定されます。

例 1
入力:
nums = [3,2,2,3], val = 3

出力:
2, nums = [2,2,_,_]

説明:
関数は k = 2 を返すべきです。nums の最初の2つの要素は 2 になります。k 以降の要素は何でもよいため、アンダースコアで示しています。

例 2
入力:
nums = [0,1,2,2,3,0,4,2], val = 2

出力:
5, nums = [0,1,4,0,3,_,_,_]

説明:
関数は k = 5 を返すべきです。最初の5つの要素は 0, 1, 4, 0, 3 で、順序は任意です。k 以降の要素は重要ではありません。

この問題では、インプレースで val を削除し、val ではない要素の数を返すアルゴリズムを実装する必要があります。

class Solution {

    /**
     * @param Integer[] $nums
     * @param Integer $val
     * @return Integer
     */
    function removeElement(&$nums, $val) {
       
        $i = 0;

        foreach($nums as $num) {
                if($num != $val) {
                    $nums[$i] = $num;
                    $i++;
                }
        }
        array_splice($nums, $i);

        return $i;
    }
}

&$nums:
配列を参照渡ししているので、$nums は関数内で直接変更。

$i の役割:
val と異なる要素が見つかるたびに nums[i] に格納して $i++ することで、val ではない要素が配列の先頭に集まる。

$i を返す:
val ではない要素の個数を返す。

Discussion

ログインするとコメントできます