非ゼロ要素の相対的な順序を維持しながらNUMS配列を指定し、すべての書き込み機能は、アレイ0の最後に移動しました。
例:
入力:[0,1,0,3,12]
出力:[1,3,12,0,0]
説明:
元の配列上で動作しなければならない、あなたは追加の配列をコピーすることはできません。
操作の数を最小限に抑えます。
方法:ダブルポインタ
私最初に0点。
最初の非ゼロJポイント。
0一各処理によって、右にステップずつステップ移動します0
1 クラスソリューション{ 2 公共: 3 ボイド moveZeroes(ベクトル< INT >&NUMS){ 4 int型 I = 0、J = 0 ; 5。 ため(; J <nums.size(); J ++ ) 6。 { 7。 一方、(私は< nums.size()&& NUMS [I] =!0)私は++; // 最初の0まで、iが停止される 。8 ながら(J <nums.size()&& NUMS [J] == 0)J ++; // 非0を見つけるために続けとの交換が、位置ので、時刻k ++した後、0に等しい 9は、 IF(nums.size J ==())BREAK 。 10 他 IF(I> J)を続行; 11 他を { // 。交換を行い、それらがなければならない1 = J + I 12は、 INT TMP = NUMS [J]; 13である NUMS [J]は= NUMSを[I]; 14 NUMS [ I] TMPを=; // この時点iが切替後の非ゼロであり、0を超える交換へJポイント 15 iは++; // 一方を減少させる、メモリに保存ビット 16 } 17 } 18 }
1 クラスソリューション{ 2 公共: 3。 ボイド moveZeroes(ベクトル< INT >&NUMS){ 4。 INT I = 0 ; 5。 ため(INT J = 0 ; J <nums.size(); J ++){ // Jが0に遭遇場合、この時点でI ++は最後のラウンドのようなので、これは実際にはiが0今回検出された 6。 IF(NUMS [J] =!0 ){ 7。 NUMS [I] = NUMS [J]を、 8 iが++ ; 9 } 10 } 11 //この時点iがゼロでない場合、切り替え後、iは0を指す0またはiが以前に割り当てられ、iは0である短い時間を意味する で12 ながら(私の< {nums.size()) 13であります NUMS [I ++] = 0 ; 14 } 15 16 } 17 }。