タイトル説明
283モバイルゼロ
非ゼロ要素の相対的な順序を維持しながらNUMS配列を指定し、すべての書き込み機能は、アレイ0の最後に移動しました。
例:
入力:[0,1,0,3,12]
出力:[1,3,12,0,0]
説明:元の配列上で動作しなければならない、あなたは追加の配列をコピーすることはできません。
操作の数を最小限に抑えます。出典:ボタン(LeetCode)に滞在
します。https://leetcode-cn.com/problems/move-zeroesリンク
すべてのネットワークからの控除が著作権を保有します。商業転載は許可公式、非商用の転載は、ソースを明記してくださいお問い合わせください。
回答:
解決策1:
個人の考え:
尾から頭、順次それがある場合、0の要素かどうかを判断し、また、右の要素は、スイッチング素子と交換後の位置Iに右に要素位置、0ではありません。
164ミリ秒
/ * * * @param {番号[]} NUMS * @return {空}の代わりにインプレースNUMSを変更し、何も返さないでください。 * / VARの moveZeroes = 関数(NUMS){ ための(I = nums.lengthせ; I> = 0; i-- ){ 場合(NUMS [I] === 0 && NUMS [I + 1] && NUMS [I !+1] == 0 ){ [NUMS [i]は、NUMS [I +1]] = [NUMS [I + 1 ]、NUMS [I] I + = 2 } } }。
解決策2:
すでに最速の答え:56ミリ
二つのポインタ、始点0、長さ1を終了する点。
開始インデックスは0、左端(end--)に尾部を押し、次に削除元素、0であれば、サイクルは、開始時刻は、この要素の端部よりも小さいです。
インデックス要素の開始が0でない場合は、++を開始、判断を続けて......
CONST moveZeroes = NUMS => { CONST最大 = nums.length 開始させ = 0 LET端 =最大- 1 ながら(<開始端)を{ CONSTアイテム = [スタート] NUMSの 場合(項目=== 0 ){ nums.splice(起動 1 ) nums.push( 0 ) エンド - 続ける } 開始 ++ } 戻りNUMS }
A3:
2に答えるために同様のアイデアを実現するためにforループを使用してください。96ms
PS:私の最初の答えは、私<nums.lengthを使用してサイクリング条件は、これは、タイムアウトが生じ、無用0のかなりの数の後ろにマルチサイクルにこの問題を解決するための動的エンドの導入をリードします。
VaRの moveZeroes = 関数(NUMS)は{ 端せ = nums.length ために(LET I = 0; I <END; iは++ ){ 場合(NUMS [I] === 0 ){ nums.splice(I、 1 ) NUMS。プッシュ( 0 ) I - エンド - } } }。