問題の説明#
与えられた配列 nums に対して、すべての 0 を配列の末尾に移動させる関数を作成し、非ゼロ要素の相対的な順序を保持します。
注意してください、配列をコピーせずにインプレースで配列を操作する必要があります。
例 1:
入力: nums = [0,1,0,3,12]
出力: [1,3,12,0,0]
例 2:
入力: nums = [0]
出力: [0]
ヒント:
1 <= nums.length <= 10^4
-2^31 <= nums[i] <= 2^31 - 1
考え方#
- 最も簡単なのは、一度の走査で 0 に出会ったら配列の最後に置くことですが、そうすると新しい配列スペースを開放することになります。
- 2 つのポインタを使用して、左から右に走査し、0 に出会ったら取り出して配列の末尾に置き、右ポインタを左に一歩移動させます。そうでなければ、左から右に移動します。
解答#
/**
* @param {number[]} nums
* @return {void} 何も返さず、代わりに nums をインプレースで修正します。
*/
var moveZeroes = function(nums) {
let l = 0, r = nums.length;
while (l < r) {
if (nums[l] === 0) {
nums.push(nums.splice(l, 1));
r--;
} else {
l++;
}
}
};