トピック:
アレイ所与 nums
、書き込み機能は、すべてであろう 0
非ゼロ要素の相対的な順序を維持しながら、アレイの端に移動します。
対象が元のデータ上で動作するように、空間ラインアレイを開くために必要とされないことに留意されたいです。
例:
入力:[0,1,0,3,12]
出力:[1,3,12,0,0]
説明:
- 元の配列上で動作しなければならない、あなたは追加の配列をコピーすることはできません。
- 操作の数を最小限に抑えます。
自己答え:
1思考:2つのループのトラバースのために、上記のようなアルゴリズムをバブリングし、リスト0順次最後尾に移動しました。
短所:答えをアップロードする際の複雑さが高すぎる、N ^ nは、文句を言うでしょう。
2考える:数が0である場合、配列をループするために、除去番号を削除し、
ここでは、2つのPythonの知識があります。
もともと、私は最初の0の同じ量を追加し、さらにバック、すべての0を削除し、後に期待していた、しかし、我々は状況が0を削除する余裕がないことが判明しました
LIST1 = [0,2,0,0,8,0,8,0,1 ] クラス対処方法2: DEF moveZeroes(自己、NUMS) のために私にNUMS: もし I == 0: nums.remove(I) #nums.append(0) 印刷(NUMS) S = 対処方法2() s.moveZeroes(LIST1) #1 [2、8、8、0、1]
Baiduは謎の多くが見つかりました:
循環原理について
すべてNUMSをループのためのpythonには、以下の規格に準拠したリストを通過する、添字です。
側縁削除リストを横断するときに、リークケースを横断するデジタルリストが削除された場合、後者の図のように、また変更され、そのインデックスを維持する現れます
LIST1 = [1,2,3,4,5,6 ] のために私にLIST1: 削除(I) #[2,4,6]
削除された1ので、そのループの代わりに、元の1の2位は、今、リスト内の2位が誰であるかを探します、2は数3であることは明らかです。
6のあとにトラバースではなく、問題がある、それに対処する方法を通過しません3つの索引がありません。
この原則は__next__方法を持っている内部循環のために必要とする時間は、エラーを取得することはできません場合は、次の要素を取得することで、内部処理エラーが値を停止します。
原理を削除
しかし、単にこの場合の結果は、上記のコードは、[2,0,8,8,0,1]モルホリンの最後の実行はありません。
削除の元々の理由を削除すると、最初のマッチのリストの現在の値を削除することですので、戻って通過するとき0 0削除が以前のスキップが、最終的に常に存在欠場するので、トラバース0に、常に比較的小さいです1-2。
ソリューション:
1.このメソッドは、同じ方法であるため、ちょうどあなたが別の角度から考えることができるように、インデックス全体のトラバースを通過していないオリジナルのエンディングを作る0 0が追加側縁の削除、後ろに、完璧ではありません。
私たちは、それぞれがチャンスを削除トラバース0 0になります(削除)、それぞれが0 0を削除するために追加されますので、同じリストの長さの合計は、最後のオリジナルリスト・トラバーサルの終了後、0がなるまでそれに追加横断しますトラバース終了。
または、明らかに追加されたものを、キュー0、0のすべてを削除するには、可能な限り同じ長さの場合リストを確保するために、それのこれらの行くことを理解:
LIST1 = [0,2,0,0,8,0,8,0,1 ] クラス対処方法2: DEF moveZeroes(自己、NUMS) のために私にNUMS: もし I == 0 nums.remove(I) NUMS .append(0) 印刷(NUMS) #1 [2、8,8、1、0、0、0、0、0]
図2に示すように、後方から横断します。
問題を循環させながら、この方法は、任意のリスト要素の変更に適用され、使用のデフォルト値は、スライス:
クラスのソリューション: DEF moveZeroes(自己、NUMS:リスト[INT]) - > なし: のための私で NUMS [:: - 1 ]: もし私== 0: nums.remove(I) nums.append(0)
リスト内の合計の最後に0の0の追加と削除、それは今後のサイクルのためのトラバーサルの値には影響しません。
公式の答え:
対象タグは、ダブルポインタのアレイです。あなたは行うことができます。
ポインタへのロングとショートのポインタの定義。
リストの最後の要素まで0に長いポインタを分析、短いポインタがリストに非ゼロ値を記録するために使用されます。
最後に、短いポインタの終わりに機能を実現する、すべての値0に変更します。
LIST1 = [0,2,0,0,8,0,8,0,1 ] クラス溶液: DEF moveZeroes(自己、NUMS): long_t = 0 short_t = 0 一方 long_t < LEN(NUMS): もし NUMS [long_t ]!= 0: NUMS [short_t] =のNUMS [long_t] long_t + = 1 short_t + = 1 さもなければ: long_t + = 1 一方 short_t < LEN(NUMS): NUMS [short_t] = 0 short_t + = 1枚の プリント(NUMS) #[2、8,8、1、0、0、0、0、0]
アレイへのpythonポインタは、この方法を用いることができる角度が比較的合理的である実行時間の点でこの方法を実施しました。
例:
入力:[0,1,0,3,12]
出力:[1,3,12,0,0]
説明:
- 元の配列上で動作しなければならない、あなたは追加の配列をコピーすることはできません。
- 操作の数を最小限に抑えます。