Массивы |Найти повторяющиеся целые числа, используя деление массива? - PullRequest
0 голосов
/ 02 апреля 2019

Как заставить метод показывать повторяющиеся цифры.Это кажется логичной ошибкой, которая останавливает меня, и я не знаю, почему код не делает то, что должен делать.

  public static void findRepeating(int[] arr) { 
        for (int i = 0; i< arr.length; i++) {
             for(int d = 0; d<arr.length; d++) {
                 if(arr[i] / arr[d] == 1) {
                     System.out.println(arr[i] + " is repeating");
                 }
             }
        }
    }


    public static void main(String[] args) {

        int[] myArray = {69, 7, 8, 9, 90, 666, 69, 420, 2};


        findRepeating(myArray);

    }

}

Ответы [ 4 ]

3 голосов
/ 02 апреля 2019

Вот поправка для логики во внутреннем цикле for и сравнения

  public static void findRepeating(int[] arr) { 
    for (int i = 0; i< arr.length; i++) {
         for(int d = i+1; d<arr.length; d++) { //check with next element, as u will iterate over same element if iterating from start
             if(arr[i] == arr[d]) { // checking for same number, as division can give 1 in multiple case for ex 11/7 is also 1
                 System.out.println(arr[i] + " is repeating");
             }
         }
    }
}
2 голосов
/ 02 апреля 2019

Эта проблема уже освещена в вашем подходе, но повторять и повторять элемент снова и снова не рекомендуется, если размер вашего массива слишком велик (временная сложность O (n ^ 2)), лучше подумайте об этом, пока вы выполняете итерацию по массиву. за O (n) время с дополнительным пробелом O (n)

Set<Integer> hs = new HashSet<Integer>(); // to store elements
for (int i = 0; i< arr.length; i++) {
            if(hs.contains(arr[i])) { // Checking if element is present in set or not
                System.out.println(arr[i] + " is repeating");
            }else {
                hs.add(arr[i]);
         }
     }
}
2 голосов
/ 02 апреля 2019

Проблема связана с вашей логикой условия if.

if (i != d && arr[i] / arr[d] == 1 && arr[i] % arr[d] == 0)

1) Вы должны убедиться, что вы не делите на один и тот же элемент массива. Вместо этого вы можете инициализировать значение d из i+1 вместо 0.

2) Делить на должно быть равно 1

3) Там модуль должен быть 0, потому что логики деления недостаточно для этой логики. Как сказал @Eran 9/8 и 9/9 также приведут к 1, но с проверкой модуля мы можем гарантировать, что мы печатаем, что только 9 повторяет

public static void findRepeating(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        for (int d = 0; d < arr.length; d++) {
            if (i != d && arr[i] / arr[d] == 1 && arr[i] % arr[d] == 0) {
                System.out.println(arr[i] + " is repeating");
            }
        }
    }
}

public static void main(String[] args) {
    int[] myArray = { 69, 7, 8, 9, 90, 666, 69, 420, 2 };
    findRepeating(myArray);
}
1 голос
/ 02 апреля 2019

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

public static void findRepeating(int[] arr) {
        if(arr.length<2) { return; } // edge case condition
        for (int i = 0; i< arr.length; i++) {
            for(int d = i+1; d<arr.length; d++) { // start from i+1 index
                if( arr[i] == arr[d]) {
                    System.out.println(arr[i] + " is repeating");
                }
            }
        }
    }

Теперь будет напечатано:

69 повторяется

В противном случае вы всегда будете печатать arr[i] как повторено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...