Trovare gli stessi numeri in una matrice

0

Ho una domanda qui e sto cercando di trovare una soluzione. Ma voglio vedere anche altre opinioni.

Il problema è il seguente:

There is a matrix NxN which holds integer numbers. You should count all the different numbers in the matrix with the following conditions:

  • If two-or-more same numbers are adjacent (left, right, above, below) each of other it counts as one.

Esempio di matrice:

1 2 3 4

1 1 2 4

5 6 2 2

Quindi per l'esempio sopra ci sono: 7 numeri diversi perché nella posizione della matrice: [1,1] [2,1] [2,2] ci sono 1 che ha la condizione del problema vero perciò questi 3 i numeri contano come uno, in posizione [1,4] [2,4] ci sono 4 quindi conta come uno pure, e infine in posizioni [2,3], [3,3] e [3,4] ci sono 3s quindi conta come un numero.

Il mio pensiero è di impostare i numeri duplicati su negativi e quindi contare solo i positivi, ma non sono sicuro che ciò funzionerà per tutti i casi inclusi e per i casi d'angolo.

Il mio codice:

public class matrix
{
   public static void main(String[] args)
   {
      int[][] arr = 
      { 
          {1, 2, 3, 4}, 
          {1, 1, 2, 4},
          {5, 6, 2, 2},
      };

      for(int row = 0; row < arr.length; ++row)
      {
         for(int col = 0; col < arr[row].length; ++col)
         {
            //top
            if(row!=0)
            {
               if((arr[row][col] == arr[row-1][col]) || (Math.abs(arr[row][col]) == arr[row-1][col]) || (arr[row][col] == Math.abs(arr[row-1][col])))
               {
                  arr[row-1][col] = -arr[row-1][col];
               }
            }

            //botom
            if(row!=arr.length-1)
            {
               if(arr[row][col] == arr[row+1][col] || Math.abs(arr[row][col]) == arr[row+1][col] || arr[row][col] == Math.abs(arr[row+1][col]))
               {
                  arr[row+1][col] = -arr[row+1][col];
               }
            }

            //left
            if(col!=0)
            {
               if(arr[row][col] == arr[row][col-1] || Math.abs(arr[row][col]) == arr[row][col-1] || arr[row][col] == Math.abs(arr[row][col-1]))
               {
                  arr[row][col-1] = -arr[row][col-1];
               }
            }

            //right
            if(col!=arr[0].length-1)
            {
               if(arr[row][col] == arr[row][col+1] || Math.abs(arr[row][col]) == arr[row][col+1] || arr[row][col] == Math.abs(arr[row][col+1]))
               {
                  arr[row][col+1] = -arr[row][col+1];
               }
            }
         }
      }


      for(int row = 0; row < arr.length; ++row)
      {
         for(int col = 0; col < arr[row].length; ++col)
         {
            System.out.print(arr[row][col] + " ");
         }

         System.out.println();
      }
   }
}

Risultato previsto:

 1  2  3  4

-1 -1  2 -4

 5  6 -2 -2

Risultato del codice:

 1  2  3 -4

 1 -1 -2 -4

 5  6  2 -2
    
posta Dr. Programmer 03.12.2014 - 23:45
fonte

1 risposta

1

My thought is to set the duplicate numbers to negative and then count only the positives

Sembra che tu stia usando i negativi come un flag "isDuplicate". Questo è un grande esempio della differenza tra programmazione competitiva e programmazione professionale.

In un ambiente competitivo, stai cercando di ottimizzare il tempo necessario per scrivere il programma. Dichiarare più variabili (ad esempio dichiarando una struttura di dati "isDuplicate" esplicita) richiederebbe t.y.p.in.g. Di Più. codice. quale. prende. Di Più. tempo. Non devi dichiarare nulla di nuovo per utilizzare i negativi, quindi non devi digitare tanto, quindi ritiene che potrebbe essere un approccio produttivo.

In un ambiente professionale, non prenderei mai in considerazione l'utilizzo di negativi in questo modo. Usa i negativi se in realtà vuoi eseguire l'aritmetica sui negativi. Ci sono diversi motivi:

  • I negativi hanno proprietà peculiari - ad es. "1 + -1 == 0" e "-1 * -1 == +1"; queste proprietà sono prive di senso per il flag isDuplicate.
  • La maggior parte degli altri sviluppatori (che revisionano / aggiornano il tuo codice) non intuirebbero prontamente l'idea che "negativo" significhi "isDuplicate" (a meno che, per qualche miracolo, fossero anche codificatori competitivi che lavorano dallo stesso problema-definizione lo stesso intervallo temporale).
  • I requisiti cambiano. Oggi "isDuplicate" è un'informazione importante. Domani, "isPrime" potrebbe essere un'informazione importante. La prossima settimana potremmo decidere di eliminare le informazioni "isDuplicate". L'unico modo per mantenere queste cose dritte è dare loro dei nomi molto chiari.

Come capita, il bug in effetti si riferisce a una di quelle proprietà peculiari dei numeri negativi. (Mi morderò la lingua sui problemi specifici perché, come hanno notato i commentatori, è positivo che tu ci riesca.)

    
risposta data 04.12.2014 - 09:59
fonte

Leggi altre domande sui tag