📝
27. Remove Element
整数配列 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 と異なる要素が見つかるたびに
$i を返す:
val ではない要素の個数を返す。
Discussion