Как исправить решение, похожее на Counting Sort? - PullRequest
2 голосов
/ 29 апреля 2020

Я хотел проверить, не является ли частота минимального элемента нечетной: я бы вывел «везучий», иначе вывел «Unlucky».
Я использовал технику, связанную с подсчетом сортировки arr [arr1 [i]] ++ подсчет, дублированный как значение и ссылка на фактическое значение его ИНДЕКС. Я пытался с этим, но это не принесло правильного ответа.

вывод: Не повезло

, так как минимальная частота равна 7, 7% 2! = 0, поэтому не повезло

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int t=in.nextInt();
    while(t-->0) {      //Test cases
    int n=in.nextInt();//array's length

    int arr[]=new int[n];// array
    for(int i=0;i<arr.length;i++) {
        arr[i]=in.nextInt();
    }
    int counter[]=new int[256];//counting duplicates
    for(int i=0;i<arr.length;i++) {
        counter[arr[i]]++;
    }
    int min=1;
    int pos=0;
    for(int i=0;i<counter.length;i++) {
        if(counter[i]<min && counter[i]!=0) { //search for minimal frequency (counter[i]!=0 since our counter array could easily have lot zeroes
            min=counter[i];
            pos=i;
        }
    }
    System.out.println((pos%2==0)?"Unlucky":"Lucky");
    }
}

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Рассмотрим следующие моменты:

  1. Ваша программа менее полезна / эффективна по трем причинам: (A) Она будет работать только для целых чисел от 0 до 255 (B) Вы используете массив фиксированного размера размером 256, что означает, что даже если пользователь введет всего несколько чисел, он будет использовать пространство для 256 целых чисел (C) Вы выполняете итерацию l oop 256 раз, чтобы вычислить частоту, даже если пользователь вводит только несколько цифр.
  2. Существует так много способов подсчитать частоту чисел. Обычно люди используют Map для этого. Я использовал то же самое в функции, minFrequencyNumber, показанной ниже:
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("Enter the size of array: ");
        int n = in.nextInt();
        int arr[] = new int[n];
        System.out.print("Enter " + n + " integers: ");
        for (int i = 0; i < arr.length; i++) {
            arr[i] = in.nextInt();
        }
        System.out.println("The number with minimum frequency is: " + minFrequencyNumber(arr));
        System.out.println((minFrequencyNumber(arr) % 2 == 0) ? "Unlucky" : "Lucky");
    }

    public static int minFrequencyNumber(int[] arr) {
        Map<Integer, Integer> m = new HashMap<>();
        // Iterate the array
        for (int i : arr) {
            // If the number does not exist in the Map, put the number as the key and 1 as
            // the value (frequency); otherwise, put the number as the key in the map by
            // increasing its value (frequency) by 1
            m.put(i, m.getOrDefault(i, 0) + 1);
        }
        int num = 0, minFrequency = Integer.MAX_VALUE;
        // Iterate the map
        for (Entry<Integer, Integer> e : m.entrySet()) {
            if (e.getValue() < minFrequency) {
                minFrequency = e.getValue();
                // Store the key (the number) whose frequency is minimum
                num = e.getKey();
            }
        }
        return num;
    }
}

Пример прогона:

Enter the size of array: 12
Enter 12 integers: 6 6 6 4 4 4 4 3 3 3 7 7
The number with minimum frequency is: 7
Lucky
0 голосов
/ 29 апреля 2020

Пока нет необходимости в l oop и других l oop для counter, вы присваиваете массив с помощью переменной n, затем вводите значения в arr и проверяете частоту в том же л oop. И выберите минимальную частоту, чтобы проверить, является ли она lucky или not

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();// array's length

        int arr[] = new int[n];// array
        int counter[] = new int[n];
        int min = 1;
        int pos = 0;
        for (int i = 0; i < arr.length; i++) {
            arr[i] = in.nextInt();
            counter[arr[i]]++;
            if (counter[i] < min && counter[i] != 0) {
                min = counter[i];
                pos = i;
            }
        }

        System.out.println((pos % 2 == 0) ? "Unlucky" : "Lucky");
        in.close();
    }

, вход

12 6 6 6 4 4 4 4 3 3 3 7 7

, выход

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