L’output di restituire la cifra non arriva come previsto?

Data una serie di numeri come input, restituire la cifra che si verifica il numero massimo di volte nell’input.

Non conosco le dimensioni del nuovo array che sto creando. Ho assunto che le dimensioni siano doppie. Per separare le cifre che ho diviso, il numero ha preso le modulazioni e aggiunto al nuovo array. Dopo aver trovato il numero massimo nel nuovo array.Ma non sto ottenendo l’output come previsto.

@Edit Secondo le risposte menzionate ho modificato il codice. Ora il problema si verifica è che i miei valori dell’array c non sono referenziati (voglio dire, li ho separati con le loro cifre ma sto ottenendo la stessa matrice di numeri quando sto restituendo q

Qualcuno può guidarmi cosa sto facendo male?

public int frequentDigit(int[] numbers) { int q=0; int c[]=seperateDigits(numbers); int p=findMax(c); for(int i=0;i<c.length;i++) { if(p==i) { //b1=true; q=numbers[i]; break; } } return q; } int[] seperateDigits(int[] numbers) { int count=0; for (int i = 0; i  0) { int aDigit = aNumber % 10; System.out.println(aDigit); count++; aNumber = aNumber / 10; } } } int c[] = new int[count]; for (int i = 0; i  0) { int aDigit = aNumber % 10; //System.out.println(aDigit); //count++; c[i]=aDigit; //@Edit //System.out.println(c[i]); //@Edit aNumber = aNumber / 10; } } } return c; } int findMax(int c[]) { int max = c[0]; int max_i = 0; for (int i = 1; i  max) { max = c[i]; max_i = i; } } return max_i; } 

Produzione

  Parameters | Actual Output | Expected Output ---------------------------|-----------------|----------------- {24,27,30,31,34,37,40,42} | 40 | 3 

Un paio di cose che vedo …

1) Il tuo metodo frequentDigit dovrebbe restituire int , non int[] .

2) È necessario utilizzare un array di lunghezza 10 come @Andreas menziona nei commenti.

3) Il metodo findMax restituisce il numero di volte in cui si verifica la cifra più frequente, non la cifra stessa. Per acquisire la cifra, è necessario tenere traccia sia del valore max che del valore i corrispondente. Non è necessario controllare la lunghezza di c , il ciclo for fa per te.

 int findMax(int c[]) { int max = c[0]; int max_i = 0; for (int i = 1; i < c.length; i++) { if (c[i] > max) { max = c[i]; max_i = i; } } return max_i; } 

4) Il tuo ciclo for in seperateDigits (a parte: “separato”, non “separato”) sta facendo alcune cose misteriose che sono ben motivate ma non corrette.

 int c[] = new int[10]; //System.out.println(c.length); for (int i = 0; i < numbers.length; i++) { int aNumber = numbers[i]; if (aNumber == 0) c[0]++; else { while (aNumber > 0) { int aDigit = aNumber % 10; System.out.println(aDigit); c[aDigit]++; System.out.println(c[aDigit]); aNumber = aNumber / 10; } } } 

L’intera Enchilada

 package xyz; public class DigitCounter { public static void main(String[] args) { DigitCounter me = new DigitCounter(); System.out.println(me.frequentDigit(24, 27, 30, 31, 34, 37, 40, 42)); System.out.println(me.frequentDigit(12345, 54321, 24, 159, 2468, 98765, 0, 1020304050)); System.out.println(me.frequentDigit(123, -654, 879)); System.out.println(me.frequentDigit(0)); } public int frequentDigit(int... numbers) { int c[] = separateDigits(numbers); int p = findMax(c); return p; } int[] separateDigits(int[] numbers) { int c[] = new int[10]; for (int i = 0; i < numbers.length; i++) { int aNumber = numbers[i]; if (aNumber == 0) c[0]++; else { while (aNumber > 0) { int aDigit = aNumber % 10; c[aDigit]++; aNumber = aNumber / 10; } } } return c; } int findMax(int c[]) { int max = c[0]; int max_i = 0; for (int i = 1; i < c.length; i++) { if (c[i] > max) { max = c[i]; max_i = i; } } return max_i; } } 

Ecco una versione combinata. Può gestire valori zero (conta come una singola cifra 0 ) e valori negativi (il segno viene ignorato). Un array vuoto restituisce -1 e un array null genera NullPointerException .

 private static int findMostFrequentDigit(int ... input) { int[] digitCount = new int[10]; for (int value : input) do { digitCount[Math.abs(value % 10)]++; } while ((value /= 10) != 0); int maxCount = 0, maxDigit = -1; for (int i = 0; i < 10; i++) if (digitCount[i] > maxCount) { // or >= to find the last max-digit maxCount = digitCount[i]; maxDigit = i; } // printDebug(input, digitCount, maxCount); return maxDigit; } 

Test

 System.out.println(findMostFrequentDigit(24,27,30,31,34,37,40,42)); System.out.println(findMostFrequentDigit(12345, 54321, 24, 159, 2468, 98765, 0, 1020304050)); System.out.println(findMostFrequentDigit(123, -654, 879)); System.out.println(findMostFrequentDigit(0)); 

Produzione

 3 0 1 0 

Per un buon output di debug, utilizzare questo metodo e rimuovere il commento dalla printDebug() sopra:

 private static void printDebug(int[] input, int[] digitCount, int maxCount) { System.out.println(Arrays.toString(input)); String format = "%" + (Integer.toString(maxCount).length() + 1) + "d"; System.out.print(" Digit:"); for (int i = 0; i < 10; i++) System.out.printf(format, i); System.out.println(); System.out.print(" Count:"); for (int i = 0; i < 10; i++) System.out.printf(format, digitCount[i]); System.out.println(); format = "%" + (Integer.toString(maxCount).length() + 1) + "s"; System.out.print(" Max: "); for (int i = 0; i < 10; i++) System.out.printf(format, digitCount[i] == maxCount ? "^" : ""); System.out.println(); } 

Produzione

 [24, 27, 30, 31, 34, 37, 40, 42] Digit: 0 1 2 3 4 5 6 7 8 9 Count: 2 1 3 4 4 0 0 2 0 0 Max: ^ ^ [12345, 54321, 24, 159, 2468, 98765, 0, 1020304050] Digit: 0 1 2 3 4 5 6 7 8 9 Count: 6 4 5 3 5 5 2 1 2 2 Max: ^ [123, -654, 879] Digit: 0 1 2 3 4 5 6 7 8 9 Count: 0 1 1 1 1 1 1 1 1 1 Max: ^ ^ ^ ^ ^ ^ ^ ^ ^ [0] Digit: 0 1 2 3 4 5 6 7 8 9 Count: 1 0 0 0 0 0 0 0 0 0 Max: ^