2016-07-11 8 views
-2

私は0から配列の長さまでの配列を持っていますが、いくつかの数がなくなっています。HashMap with Integers long time

public static Integer findNumber(Integer[] array){ 
    Map<Integer, Integer> map = new HashMap<Integer, Integer>(); 
    for(Integer number : array){ 
     map.put(number, 1); 
    } 
    for(Integer i=0; i<array.length; i++){ 
     if(map.get(i)==null) 
      return i; 
    } 
    return -1; 
} 

私はこれは良い解決策になるつもりだったと思ったが、置くことははるかに高速でカウント重複してソリューションを並べ替え、本当に長い時間がかかり、私がなぜ分かりません。 Hash for IntegerはInteger自体であるため、ハッシュを数えると時間が失われず、等号で反復されることもありません(数字に依存して、私は1つの複製だけを使って例を選びました)。ここで明白な何かが欠けているような気がする。私は初期容量と負荷率を指定しようとしましたが、状況を悪化させるだけです。何とかこれを最適化できますか?

パッティングには時間がかかりますが、解決策を見つけるまで繰り返すのではなく、パッティングは実行時間の95%と同じです。

+0

多くのボクシング/アンボクシングのために遅くなる可能性がありますか? – kaqqao

+0

セットはマップより少し速くなります。 –

+0

私もそう思っていました。私は基本的なintで始まり、次にIntegerのために変更しました。何も変更しませんでした。私はそれが物事を遅くしても、それをずっと遅くしないと思う。 – Haratino

答えて

-1

もっと単純な解決策があると思います。試してみてください:

public static Integer findNumber(Integer[] array){ 

    for(Integer i=0; i<array.length; i++){ 
     if(i != array[i]) 
      return i; 
    } 
    return -1; 
} 

希望はあなたを助けます。

+0

私はそれがうまくいくとは思わない、例: 'array = {2,1,3}'不足している数字は0だがあなたのコードは2を返すだろう。 – niceman

+0

このコードは重複した番号や配列を扱っていない。 – Tom

+0

右のニセマン、私は問題をよく理解していませんでした。しかし、いくつかの研究の後、私は彼が探しているものは(数学的に)ここに答えていると思う[http://stackoverflow.com/questions/2113795/quickest-way-to-find-missing-number-in-an-array-of-numbers ](http://stackoverflow.com/questions/2113795/quickest-way-to-find-missing-number-in-an-array-of-numbers) – mrk

0

マップの代わりに、(プリミティブ)ブール値の配列を使用できます。アレイ上でその後 boolArray[number] = true;

、ループを、あなたがマップを使う、という場合は欠番

+0

はい、実際にマップで達成したいと思っていたアイデアです私は地図がこれと同じくらい速くなると思っていました。おそらくちょっと遅くなりました。なぜなら、フードの下ではほとんど同じことをしているからです。数字20を地図に入れて、同じハッシュを数えてからinternalArray [20] = 1はboolArray [number] = trueのようです。 – Haratino

+0

違いは、bool配列を塗りつぶした後、数値配列ではなく反復処理を行うことです。他の答えを参照してください。ヌルを検索するためにマップの値を反復します。 –

0

を見つける:最初のループでは、代わりに1を入れてのあなたは真の配列のセルを反転第二のループべきないアレイの上に行くのではなく、マップの値より、ヌル1を探して:あなたは簡単で高速道を行くことができ

map.values().stream().filter(v -> v == null).findFirst(); 
3

:和整数を配列にして、sum from 1 to nからそれを引く(それは数の合計です1からnまで)。残りの値は欠けている番号です。

+0

これらのパズルの多くは、探していて、プログラミングのものではありません。 +1 –

関連する問題