説明
配列NUMSと値valを考えると、あなたはすべて同じ値valを削除するために要素を配置する必要があり、除去後の配列の長さを返します。
配列のための余分なスペースを使用しないでください、あなたは代わりに入力配列を変更し、使用のO(1)余分なスペースの条件の下で完了しなければなりません。
要素の順序を変更してもよいです。あなたは、新しい配列の長さの背後の要素を超えて検討する必要がありません。
例1:
所与NUMS = [3,2,2,3]、ヴァル= 3、
関数は、2の新しい長さを返す必要がありますし、最初の2つの要素のNUMSは2です。
あなたは、新しい配列の長さの背後の要素を超えて検討する必要がありません。
例2:
所与NUMS = [0,1,2,2,3,0,4,2]、ヴァル= 2、
新しい関数は、長さ5を返す必要があり、最初の5つの要素NUMSは0、1、3、0、4です。
これらの5つの要素は任意の順序であることに注意してください。
あなたは、新しい配列の長さの背後の要素を超えて検討する必要がありません。
説明:
なぜ、戻り値は整数ですが、答えは、それの出力の配列ですか?
入力アレイは、入力配列を変更することを意味する「参照」モードで渡されることに注意してくださいは、関数内の呼び出し元に表示されてください。
あなたは次のように内部動作があると想像することができます:
// NUMSはで渡さ「参照」です。これは、任意のコピー右引数である
int型のlen = removeElement(NUMS、ヴァル )。
//関数内の入力アレイと、発信者が表示されている変更。
//あなたの関数の戻りの長さは、それが配列の長さの範囲のすべての要素を出力します。
(;私は<lenを、INT I = 0 I ++){用
プリント(NUMS [I]);
}
解決
保存されたすべての指定された値のインデックス
インデックス=キューは、指定されたすべての値が、順次キューを格納します。
ダブルポインタ
NUMS [速い]が所定の値に等しい場合、要素は、高速スキップするようにインクリメントされます。限りNUMSとして[速い]!=ヴァルは、
我々はNUMSをコピーし、[速い] NUMSに[遅い] 2つのインデックスをインクリメントしながら。このプロセスは、高速の配列の終わりに達するまで繰り返され、配列の新しい長さが遅いです。
コード
保存されたすべての指定された値のインデックス
公共 INT removeElement(INT [] NUMS、INT ヴァル){ int型のカウント= 0 ; キュー <整数> preIndexQueue = 新しい LinkedListは<> (); 以下のために(INT ; I <nums.length; iが0 = I ++ ){ 場合(NUMS [I] == ヴァル){ preIndexQueue.offer(I); カウント ++ ; } それ以外の 場合(!preIndexQueue.isEmpty()){ NUMS [preIndexQueue.poll()] = NUMS [I]。 preIndexQueue.offer(I); } } リターン nums.length - 数えます。 }
ダブルポインタ
公共 INT removeElement(INT [] NUMS、INT ヴァル){ INT = 0遅いです。 int型の高速= 0 ; 以下のために(INT ; I <nums.length; iが0 = I ++ ){ 場合(NUMS [I] == ヴァル){ 速い ++ ; } 他{ NUMS [遅い ++] = NUMS [速い++ ]; } } 返却が遅いです。 }