У меня есть массив, содержащий несколько повторяющихся элементов, таких как:
найти первый повторяющийся номер, для которого второе вхождение имеет минимальный индекс.Другими словами, если имеется более 1 дублированного числа, вернуть номер, для которого второе вхождение имеет меньший индекс, чем второе вхождение другого числа.Если таких элементов нет, вернуть -1
. Для a = [2, 1, 3, 5, 3, 2] вывод должен быть firstDuplicate (a) = 3.
Есть 2 дубликата: числа 2 и 3. У второго вхождения 3 индекс меньше, чем у второго вхождения 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здесь, так как он не допускает дублирования, так как это, если условие будет работоспособным.