A:問題解決のためのアイデア
方法:カーソル速度を使用して、方法、非ゼロ要素、高速カーソル点非ゼロ要素の挿入位置に遅いポインタ。カーソルがゼロの要素を指すように迅速である場合は、バック1を移動したり、他のアサイン速いカーソルが遅いカーソルが指している要素に要素を指しています。
方法2:同じ方法を使用してカーソル速度、場合カーソルポイント位置が後方に向け顔ときにゼロでない要素、及び相互交換素子遅いカーソルポインティング移動速いゼロ要素。
O(N)、宇宙:O(1)時間は、2つの方法が上記
2:完全なコード例(C ++版、Java版)
方法1個のC ++:
クラスのソリューション { パブリック: 空 moveZeroes(ベクトル< int型 >&NUMS) { 場合(nums.size()== 0)リターン。 int型遅い= 0 ; 用(INT ;高速<nums.size();高速=低速高速++ ) { 場合(NUMS [速い]!= 0 ) { NUMS [遅い ++] = NUMS [速いです]。 } } 一方(遅い< nums.size()) { NUMS [遅い ++] = 0 ; } } }。
この方法の一つのJava:
クラスソリューション { 公共 ボイド moveZeroes(INT [] NUMS) { 場合(NUMS == NULL || nums.length == 0)のリターン; int型遅い= 0 ; 用(INT ;高速<nums.length、高速=低速高速++ ) { 場合(NUMS [速い]!= 0 ) { NUMS [遅い ++] = NUMS [速いです]。 } } 一方(遅い< nums.length) { NUMS [遅い ++] = 0 ; } } }
メソッドの2つのC ++:
クラス解決{ パブリック: ボイドスワップ(INT&、INT&B){ int型 C = A。A = B。B = C。} ボイド moveZeroes(ベクトル< INT >&NUMS) { 場合(nums.size()== 0)のリターン; int型遅い= 0 ; 用(INT迅速=遅い、速い<nums.size();高速++ ) { 場合(!NUMS [速い] = 0 ) { スワップ(NUMS [遅い ++]、NUMS [高速])。 } } } }。
この方法の2つのJava:
クラスソリューション { 公共 ボイド moveZeroes(INT [] NUMS) { 場合(NUMS == NULL || nums.length == 0)のリターン; int型遅い= 0 ; 用(INT ;高速<nums.length、高速=低速高速++ ) { 場合(NUMS [速い]!= 0 ) { int型 TEMP = NUMS [速いです]。 NUMS [速い] = NUMS [遅いです]。 NUMS [遅い] = TEMP。 遅い ++ ; } } } }