Найти повторяющееся число в массиве

#java

#java

Вопрос:

Я пытаюсь найти дубликат номера в массиве, но это не работает.

 public class FindDuplicateNumber {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int[] arr={10,20,30,40,40,25};

        int[] duplicate=duplicateNumber(arr);

        for(int dup : duplicate ){
            System.out.println("duplicate elements are:t"  dup);
        }
    }

    public static int[] duplicateNumber(int[] arr){
        int[] duplicate = new int[arr.length];
        for(int i=0;i<=arr.length-1;i  ){
           if(arr[i]==arr[  i]){
                duplicate[i]= arr[i];
            }
        }
        return duplicate;
    }
}
  

Комментарии:

1. «но он не работает». Как так? Мы не можем читать ваши мысли.

2. Кроме того, судя по вашему коду, вам может быть полезно отойти от компьютера, взять карандаш и бумагу и выяснить, как вы , как человек, найдете дубликат номера без использования компьютера. Какие шаги вы бы предприняли? Как вы могли бы перевести это в инструкции, которые вы бы дали другому человеку? Как вы могли бы перевести эти инструкции в псевдокод? И как вы могли бы перевести этот псевдокод на Java?

3. Два подхода: 1) Алгоритм с N квадратами, который берет каждый элемент и ищет его в остальной части массива. 2) Отсортируйте массив (обычно N-log-N) и найдите идентичные смежные пары.

4. я получаю дубликат массива как 0. когда я попытался его отладить, я вижу, что контроллер не входит в условие if. может ли кто-нибудь мне помочь.

5.Что произошло, когда вы использовали отладчик для проверки значений, которые сравнивались в if инструкции? Вы заметили, что какие-либо значения были пропущены? Вы знаете, что оператор меняется i ?

Ответ №1:

Никогда не используйте i или i внутри цикла, если вы действительно не хотите пропустить один из элементов массива (или аналогичных), по которым вы выполняете итерацию.

Это

 if(arr[i]==arr[  i]){
  

это не то же самое, что

 if(arr[i]==arr[i 1]){
  

Тем не менее, никогда не используйте i или i внутри выражения, где также i встречается.

Позже

Еще одна проблема, которую вы скоро увидите, заключается в том, что массив для хранения дубликатов слишком длинный. Для этого более подходит список.

Почему это не работает

Дополнительное приращение заставляет цикл пропускать все остальные элементы, поэтому пара смежных значений 40 никогда не сравнивается.

Комментарии:

1. Было бы неплохо, если бы вы дали автору некоторый псевдокод, потому что вы на самом деле не отвечаете на его / ее запрос. В противном случае это сообщение похоже на комментарий.

2. @bbalchev Ну, я указываю на ошибку, которая является основной причиной отсутствия пары смежных идентичных значений. В принципе, структура программы в порядке (если ей действительно нужно найти только смежные дубликаты).

Ответ №2:

Есть несколько проблем с алгоритмом, который вы используете прямо сейчас.

  1. Вы используете arr[ i] внутри вашего цикла for . Вы знаете, что это делает? Он увеличивает i на 1, что уже делает ваш цикл for . Отсюда и i в конце. Поэтому, когда вы выполняете цикл for, вы увеличиваете I в два раза и пропускаете половину значений вашего массива.
  2. Вы перебираете массив и сравниваете одно значение, arr [i] , с (я предполагаю, что вы пытались сделать, это сравнить его со следующим значением, arr[i 1] . Вы понимаете, почему это не сработало бы, если бы массив не был отсортирован? Что вам нужно сделать, это сравнить каждое значение с любым другим значением в массиве, для которого потребуется 2 цикла for .

Я не хочу просто писать этот код для вас, потому что я чувствую, что с помощью этих подсказок вы сможете разобраться. Если вам нужна дополнительная помощь, дайте мне знать.

Ответ №3:

То, что вы пытаетесь, нецелесообразно делать с примитивными массивами. Одна из причин заключается в том, что вы заранее не знаете, насколько большим должен быть ваш массив дубликатов. Для решения проблем такого типа необходимо использовать изменяемый тип массива, такой как ArrayList . Вот простая версия, использующая ArrayList и HashSet.

.add() Метод для HashSet возвращает false, если число уже добавлено.

 import java.util.HashSet;
import java.util.ArrayList;
import java.util.List;

public class FindDuplicateNumber {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int[] arr={10,20,30,40,40,25};

        for(Integer dup : duplicateNumber(arr)){
            System.out.println("duplicate elements are:t"  dup);
        }
    }

    public static List<Integer> duplicateNumber(int[] arr){

        HashSet<Integer> set = new HashSet<Integer>();
        List<Integer> duplicates = new ArrayList<Integer>();

        for (int index = 0; index < arr.length; index  )
            if (!set.add(arr[index]))  // false if already in set.
                duplicates.add(arr[index]); 

        return duplicates;
    }
}