Encontrar el modo de enteros en una matriz

Para este problema, debo escribir un método llamado modo que devuelve el elemento más frecuente de una matriz de enteros. Suponga que la matriz tiene al menos un elemento y que cada elemento de la matriz tiene un valor entre 0 y 100 inclusive. Rompa los lazos eligiendo el valor más bajo.

Por ejemplo, si la matriz pasada contiene los valores {27, 15, 15, 11, 27}, su método debería devolver 15. (Sugerencia: es posible que desee ver el programa Tally de antes en este capítulo para tener una idea de Cómo resolver este problema.)

Tengo un problema para ver qué está yendo mal para una entrada específica. Por ejemplo:

mode ({27, 15, 15, 27, 11, 11, 11, 14, 15, 15, 16, 19, 99, 100, 0, 27}) devuelve 15, que es correcto, pero el modo ({1, 1, 2, 3, 3}) devuelve 3 cuando debería ser 1.

Aquí está el código:

public static int mode(int[] input) {
    int returnVal = input[0]; // stores element to be returned
    int repeatCount = 0; // counts the record number of repeats
    int prevRepCnt = 0; // temporary count for repeats

    for (int i=0; i<input.length; i++) { // goes through each elem

        for (int j=i; j<input.length; j++) { // compares to each elem after the first elem

            if (i != j && input[i] == input[j]) { // if matching values
                repeatCount++; // gets the repeat count

                if (repeatCount>=prevRepCnt) { // a higher count of repeats than before
                    returnVal=input[i]; // return that element
                }
                prevRepCnt = repeatCount; // Keeps the highest repeat record
            }
            repeatCount=0; // resets repeat Count for next comparison
        }
    }
    return returnVal;
}
Respuesta 1

Aquí hay una manera más simple de resolver este problema. Cree una matriz llamada cuenta de tamaño 101. Los índices (0-100) representan los números que está contando. Atraviese la matriz de entrada y cuente las ocurrencias de cada número. Finalmente, compare los recuentos para encontrar el que aparece más (el empate va al número más bajo):

public static int mode(int[] input) {

    int[] count = new int[101];

    //count the occurrences
    for (int i=0; i < input.length; i++) {
        count[input[i]]++;
    }

    //go backwards and find the count with the most occurrences
    int index = count.length-1;
    for (int i=count.length-2; i >=0; i--) {
        if (count[i] >= count[index])
            index = i;
    }

    return index;
}
Respuesta: 2

Recientemente he analizado cuatro formas de calcular el modo de la matriz:

  • Si el rango de números en la matriz es pequeño, utilice el orden de conteo: tiempo O (N), espacio (N) pero muy eficiente. Esta solución es directamente aplicable al problema sobre el que está preguntando, ya que solo tiene 101 valores posibles en la matriz.
  • Elementos de índice en la matriz en tabla hash: tiempo O (N), espacio O (N). Esta solución es aplicable si los valores se toman de un rango amplio, como todos los números enteros.
  • Ordene la matriz y luego cuente elementos iguales sucesivos: tiempo O (NlogN), espacio O (1). Esta solución es aplicable si la matriz es demasiado grande para construir un índice.
  • Ordene parcialmente la matriz, pero omita las particiones más pequeñas que el candidato actual: tiempo O (NlogN), espacio O (1) pero mucho más eficiente que ordenar completamente la matriz porque se omitirán muchas particiones.

Puede encontrar el código fuente (aunque en C #) para los cuatro métodos y la comparación de rendimiento en este artículo: Modo de búsqueda de una matriz

Respuesta: 3

Declararía otra variable para realizar un seguimiento del "valor inferior". Y compruebe si el valor de entrada [i] es más pequeño que la variable lowerValue cuando tiene el mismo recuento. Tenga en cuenta que separé el> & = para su condición.

int lowerValue;

public static int mode(int[] input) {
    int returnVal = input[0]; // stores element to be returned
    int repeatCount = 0; // counts the record number of repeats
    int prevRepCnt = 0; // temporary count for repeats
    int lowerValue = Integer.MAX_VALUE; // initalize it with the highest integer value - 2147483647

    for (int i=0; i<input.length; i++) { // goes through each elem

        for (int j=i; j<input.length; j++) { // compares to each elem after the first elem

            if (i != j && input[i] == input[j]) { // if matching values
                repeatCount++; // gets the repeat count

                if (repeatCount>prevRepCnt) { // a higher count of repeats than before
                    returnVal=input[i]; // return that element
                    lowerValue = returnVal; // set the variable lowerValue to be the lower value
                }
                else if (repeatCount == prevRepCnt) && (input[i] < lowerValue) { // if it's the same number of count, take in whichever number is lower
                    returnVal=input[i]; // return that element
                    lowerValue = returnVal; // set the variable lowerValue to be the lower value
                }
                prevRepCnt = repeatCount; // Keeps the highest repeat record
            }
            repeatCount=0; // resets repeat Count for next comparison
        }
    }
    return returnVal;
}
Respuesta: 4

Estoy un poco confundido en este momento. Intenté eso: Prueba de cadena = "KP 175.105"; test.replace ("KP", ""); System.out.println (prueba); y obtuve: KP 175.105 Sin embargo, quiero: 175.105 ¿Qué pasa? ...

HashMap <Entero, ArrayList <Integer>> cityMap = new HashMap <> (); ... para (ArrayList <Integer> list: cityMap.values ​​()) {int size = list.size (); if (tamaño> 0) {...

Quiero impulsar una consulta en Lucene 7. En las versiones anteriores (<6) solo estaba usando el método setBoost (float boost). es decir, TermQuery termQuery = new TermQuery (nuevo término ("campo", "valor")); ...

¿Existe alguna herramienta de línea de comando que tome la fuente Java y genere diagramas de secuencia? ¿O hay alguna herramienta que convierta el código Java a XML y convierta el XML a diagramas de secuencia en cualquiera de los ...