Подсчитайте, сколько раз каждое число встречается в массиве (положительные и отрицательные значения) - PullRequest
0 голосов
/ 29 июня 2018

Я работаю над заданием, которое имеет дело с массивами, и я почти завершил его, но я застрял при подсчете каждого элемента в массиве (положительного и отрицательного) без использования сортировки, хэш-карты или списка какой-то. Я должен быть в состоянии использовать только основные методы Java. Мой код работает для всех положительных значений, но я забыл выяснить, как считать отрицательные числа. Может ли кто-то пролить свет на то, как я могу исправить свой код, чтобы он мог принимать весь диапазон положительных и отрицательных целых чисел? Спасибо!

public static void countArray(int[] arr){
    int[] count = new int[arr.length];
    int temp = 0;

    for(int i = 0; i < arr.length; i++){
        temp = arr[i];
        count[temp]++;
    }
    for(int i = 1; i < count.length; i++){
        if(count[i] > 0 && count[i] == 1){
            System.out.printf("%d occurs %d time\n", i, count[i]);
        }else if(count[i] >= 2){
            System.out.printf("%d occurs %d times\n", i, count[i]);
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

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

public static void countArray(int[] arr){
    int[] positiveIntCounts = new int[Integer.MAX_VALUE];
    int[] negativeIntCounts = new int[Integer.MAX_VALUE];
    int max;
    int min;

    int temp = 0;

    for(int i = 0; i < arr.length; i++){
        temp = arr[i];
        if (temp >= 0) {
            positiveIntCounts[temp]++;
            if (temp > max) {
                max = temp;
            }
        }
        else {
            negativeIntCounts[-temp]++;
            if (temp < min) {
                min = temp;
            }
        }
    }

    for (int i = 1; i <= max; i++){
        if (count[i] == 1){
            System.out.printf("%d occurs %d time\n", i, count[i]);
        }else if(count[i] >= 2){
            System.out.printf("%d occurs %d times\n", i, count[i]);
        }
    }

    for (int i = 1; i <= -max; i++){
        if (count[i] == 1){
            System.out.printf("%d occurs %d time\n", -i, count[i]);
        }else if(count[i] >= 2){
            System.out.printf("%d occurs %d times\n", -i, count[i]);
        }
    }
}
0 голосов
/ 29 июня 2018

Вам как-то нужно сопоставить значения со значениями в вашем массиве счетчиков. Поскольку вы не можете использовать карту, вы можете использовать другой массив для хранения сопоставления значений, которые вы рассчитываете, с индексами в массиве count:

public static void count(int[] numbers) {
    int[] counts = new int[numbers.length];
    int[] mapping = new int[numbers.length];
    int mappings = 0; // how many mappings are used

    // map them
    for (int number : numbers) {
        boolean found = false;
        for (int i = 0; i < mappings; i++) {
            if (number == mapping[i]) {
                found = true; // already mapped
            }
        }
        if (!found) {
            mapping[mappings++] = number; // add a new mapping
        }
    }

    // count them
    for (int number : numbers) {
        int mapped = 0;
        boolean found = false;
        for (int i = 0; i < mappings; i++) {
            if (number == mapping[i]) {
                found = true;
                mapped = i; // found the mapping
                break;
            }
        }
        if (!found) throw new IllegalStateException("can't happen");
        counts[mapped]++;
    }

    // print them
    for (int i = 0; i < mappings; i++) {
        int number = mapping[i];
        int count = counts[i];
        System.out.format("%,d occurs %d time%s%n", number, count, count==1?"":"s");
    }
}

Массив отображений не будет полностью использован, если есть какие-либо дубликаты, поэтому нам нужно отдельно отслеживать, сколько использований отображений, а не зацикливаться до mapping.length.

0 голосов
/ 29 июня 2018

Вы можете использовать Map<Integer,Integer> для хранения отсчетов или выполнить первый проход для вычисления минимального значения и увеличить count[temp-min].

UPDATE:

На самом деле вам нужно вычислить минимальное максимальное значение и выделить массив длиной max-min+1.

ОБНОВЛЕНИЕ 2:

public static void countArray(int[] arr){
    if (arr != null && arr.length > 0) {
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < arr.length; ++i) {
            if (arr[i] < min) {
                min = arr[i];
            }
            if (arr[i] < max) {
                max = arr[i];
            }
        }
        int[] count = new int[max-min+1];
        int temp = 0;

        for(int i = 0; i < arr.length; i++){
            temp = arr[i];
            count[temp-min]++;
        }
        for(int i = 0; i < count.length; i++){
            if(count[i] == 1){
                System.out.printf("%d occurs %d time\n", i-min, count[i]);
            }else if(count[i] >= 2){
                System.out.printf("%d occurs %d times\n", i-min, count[i]);
            }
        }
    }
}
...