まず、アレイ---ゼロを移動※※※※※※

非ゼロ要素の相対的な順序を維持しながら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 }。

 

おすすめ

転載: www.cnblogs.com/pacino12134/p/11002384.html