[解決済み] 最小のインデックスを持つ配列の中で、最初に重複する要素を見つける。
質問
以下のような重複した要素を含む配列があります。
2番目に出現するインデックスが最小となる、最初の重複した番号を見つける。言い換えれば、重複する数字が1つ以上ある場合、2番目に出現する数字が他の数字の2番目に出現する数字よりも小さいインデックスを持つ数字を返す。そのような要素がない場合は、-1を返す。
a = [2, 1, 3, 5, 3, 2]の場合、出力は次のようになります。 firstDuplicate(a) = 3.
重複しているのは、2番と3番の2つです。2番目に出現する3は2番目に出現する2よりもインデックスが小さいので、答えは3です。
私はこれを試してみました.
int firstDuplicate(int[] a) {
Set<Integer> set = new HashSet<>();
Map<Integer, Integer> hm = new HashMap<Integer,Integer>();
Map.Entry<Integer, Integer> min = null;
for(int i=0;i<a.length;i++){
// if(!hm.containsKey(a[i]))
hm.put(a[i],i);
}
for(Map.Entry<Integer,Integer> entry : hm.entrySet()){
if(min == null || entry.getValue() < min.getValue()){
min = entry;
}
}
return min == null ? new Integer(-1) : min.getKey();
}
これはうまくいきませんが、ネットで別の解決策を得ました。
int firstDuplicate(int[] a) {
Set<Integer> set = new HashSet<>();
Map<Integer, Integer> hm = new HashMap<Integer,Integer>();
Map.Entry<Integer, Integer> min = null;
for(int i=0;i<a.length;i++){
if(set.add(a[i])==false && !hm.containsKey(a[i]))
hm.put(a[i],i);
}
for(Map.Entry<Integer,Integer> entry : hm.entrySet()){
if(min == null || entry.getValue() < min.getValue()){
min = entry;
}
}
return min == null ? new Integer(-1) : min.getKey();
}
Hashsetは重複を許さないので、このif条件はどのように機能するのか、どなたか教えてください。
どのように解決するのですか?
最初の試みが失敗した理由は、配列の要素をキーとして
Map
この場合、すでに存在するかどうかを確認する必要があります。
Map
.
あなたが見つけた代替コードは、何か違うことをしています。それは
Set
で現在の配列要素がすでに出現しているかどうかを調べ、 そうであればそれをキーとして
Map
は、まだそこにない場合だけです。つまり
Map
は、配列内で複数回出現する要素のみを含み、各要素に関連付けられたインデックスは、最初の重複の出現箇所となります。つまり、配列
{2, 1, 3, 5, 3, 2}
は、その
Map
を含むことになります。
{2=5, 3=4}
. そして、最小の値を持つキー(最初の重複のインデックスに対応する)を返します。
しかし
Map
は不要です。なぜなら、重複を見つける必要があるのは1つだけで、すべて見つける必要はないからです。そのため
Set
を使って最初の重複を探し出し、それを返します。
int firstDuplicate(int[] a)
{
Set<Integer> set = new HashSet<>();
for(int i=0;i<a.length;i++){
if(!set.add(a[i])) {
return a[i];
}
}
return -1; // no duplicates found
}
これは
set.add()
を返す
false
もし
Set
は、追加したい要素をすでに含んでいます。一度
false
で初めて、最初の重複を発見したことになります。
関連
-
[解決済み】Java、"変数名 "を変数に解決することができない
-
[解決済み] 数値の配列の和の求め方
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み] Java の配列を表示する最も簡単な方法は何ですか?
-
[解決済み] JavaScriptで配列の先頭に新しい配列要素を追加するにはどうすればよいですか?
-
[解決済み] JavaScriptのオブジェクトの配列からidでオブジェクトを検索する
-
[解決済み] 配列の最後の項目を取得する
-
[解決済み] 配列の最初の要素を取得する
-
[解決済み] Bashでインデックスを指定せずに配列に新しい要素を追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Javaの".class期待値"
-
[解決済み】エラー。Selection does not contain a main type
-
[解決済み】エラー「No enclosing instance of type Foo is accessible」の原因と修正方法について教えてください。
-
[解決済み] 二項演算子「&」のオペランド型がおかしい java
-
[解決済み】「error: '.class' expected」の意味と修正方法について
-
[解決済み】Eclipseがエラーメッセージ "Java was started but returned exit code = 1" を返す
-
[解決済み】Hibernateの例外「failed to lazily initialize a collection of role」の解決方法
-
[解決済み】Eclipseで「JUnitテストが見つかりませんでした。
-
[解決済み] Hide Utility Class Constructor : ユーティリティクラスはパブリックまたはデフォルトコンストラクタを持つべきではありません。
-
[解決済み] JavaでSSLピアが正しくシャットダウンされない