es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo encontrar los números que aparecen solo una vez en una matriz?

Tengo una matriz dada llamada m y sus dimensiones son n por n y contiene números enteros. Necesito copiar los números que aparecen solo una vez a un nuevo arreglo llamado a.

Creo que la lógica sería tener un bucle for para cada número en la matriz y compararlo con cada otro número, pero no sé cómo hacer eso en código.

Solo puedo usar bucles (sin mapas u otras cosas) y esto es lo que se me ocurre:

public static void Page111Ex14(int[][] m) {

int previous = 0, h = 0;

int[] a = new int[m.length*m[0].length];

for (int i = 0; i < m.length; i++) {
    for (int j = 0; j < m[0].length; j++) {
        previous = m[i][j];

        if (m[i][j] != previous) {
            a[h] = m[i][j];
            h++;
        }
    }
}

Probablemente no sea correcto, sin embargo.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay algunos problemas con el código proporcionado. En primer lugar, la variable previous se inicializa a 0 fuera del bucle, por lo que siempre estará comparando el elemento actual con 0 en lugar del elemento anterior. Además, la instrucción if verifica si el elemento actual no es igual al elemento anterior, lo cual no tiene sentido, ya que siempre serán iguales en la primera iteración del bucle interno.

    Para copiar solo los números que aparecen una sola vez en una nueva matriz, una aproximación es utilizar bucles for anidados para recorrer cada elemento de la matriz y luego verificar si aparece en el resto de la matriz. Si no aparece en ningún otro lugar, se agrega al nuevo arreglo a. Aquí tienes un ejemplo de código:

    public static int[] getUniqueNumbers(int[][] m) {
        int[] a = new int[m.length * m.length];
        int count = 0;
    
        for(int i = 0; i < m.length; i++) {
            for(int j = 0; j < m.length; j++) {
                int num = m[i][j];
                boolean foundDuplicate = false;
    
                // ver si num aparece en el resto de la matriz
                for(int k = 0; k < m.length; k++) {
                    for(int l = 0; l < m.length; l++) {
                        if(k == i && l == j) {
                            // omitir el elemento actual
                            continue;
                        }
                        if(m[k][l] == num) {
                            // num aparece en otro lugar, así que se omite
                            foundDuplicate = true;
                            break;
                        }
                    }
                    if(foundDuplicate) {
                        // num aparece en otro lugar, así que se omite
                        break;
                    }
                }
    
                if(!foundDuplicate) {
                    // num es único, se agrega al arreglo
                    a[count++] = num;
                }
            }
        }
    
        // recortar el arreglo para incluir solo los elementos únicos
        int[] result = new int[count];
        for(int i = 0; i < count; i++) {
            result[i] = a[i];
        }
        return result;
    }
    

    Este código debería crear correctamente una nueva matriz que contiene solo los elementos únicos de la matriz de entrada. Ten en cuenta que esta implementación no es muy eficiente, ya que tiene que verificar cada elemento de la matriz en busca de duplicados. Si el rendimiento es una preocupación, puede haber mejores formas de abordar el problema.

Comments are closed.