これは私が遭遇した一般的な面接の質問ですが、要求された方法でそれを改善できませんでした.
assume we have an int array int[] A, we want to find the first duplicate entry.
ほとんどの人が HashSet の使用を考え、解析中に追加することができます。これにより、O(n) 時間と O(n) スペースが発生します。この後、他のデータ構造なしで解決するように求められました。最もばかげたアイデアは、それぞれを O(n^2) 時間で比較することだと言いました。そして、O(n^2)時間の改善を求められました。
そしてそれを改善するために、固定サイズの配列を使用することを考えました(最大数がnであると仮定)、boolean [] b = new boolean [n]; しかし、私はこの方法を使用することを許可されていませんでした。
次に、ビット操作を使用して int 変数を使用することを考えました。最大数が 32 より小さい場合、n に対して 1 ~ n ビットを左にプッシュし、| チェッカーに & チェッカーを配列内の次のエントリに移動して、> 0 かどうかを確認します。例:
int c = A[i]; if(check & (1 << c) > 0) return false; check |= 1 << c;
ただし、これも許可されていません。
それで、配列自体をハッシュセット/ハッシュテーブル、および「線形ハッシュ」として使用できるというヒントがありましたか?
何か助けはありますか?ありがとう