Funzione che emetterebbe tutti i valori distinti in una matrice

1

Voglio creare una funzione che emetta i valori distinti in un determinato array. Ad esempio, nella seguente sequenza 2 2 1 1 5 2, le cifre distinte sono 2 1 5. Quello che ho fatto fino ad ora è:

void Distinct(int a[], int b[], int n){

    int i;                    //n is the number of elements for a and b
    int k=0;                  //a is the original array       
    int ac;


b[0] = a[0];
    for (i = 0; i <= n; ++i){
       if (a[i] != b[k])
                   {
                  k+=1; 
                  ac = a[i]; 
                  b[k] =ac; //b is where I want to put distinct digits
                      }

    }


    for ( i = 0; i < k; ++i)
    {
        printf("%d ", b[i]);
    }
}

Ma questo non è abbastanza, perché quello che ho fatto è per il caso in cui i numeri si ripetono uno dopo l'altro, voglio dire: 111122221, avrò 121 e 1 alla fine di nuovo. Per favore, aiutami a scrivere una funzione che prenderebbe in considerazione questo caso, con numeri ripetuti sparsi nell'array? Grazie.

    
posta I.Gandakov 07.03.2015 - 19:03
fonte

2 risposte

4

Ci sono molti, molti modi per farlo e non hai davvero specificato se stai cercando qualcosa di semplice da codificare o performante o se hai un limite superiore ai numeri possibili o qualsiasi altra restrizione che potrebbe aiutaci a dire quale risposta hai bisogno.

Ma il tuo codice di esempio implica che vuoi la soluzione in un linguaggio "di basso livello" in cui abbiamo a che fare con array costituiti da byte piuttosto che con un costrutto di livello superiore come una lista / tupla / vettore che rende banale fai cose come rimuovere elementi dal centro. Pertanto, ti suggerisco di eseguire un algoritmo di ordinamento sull'array di input (se sei in C ++, sarebbe std :: sort), quindi esegui la tua funzione Distinct () su quell'array ordinato per creare un array univoco corretto .

    
risposta data 07.03.2015 - 23:44
fonte
2

Abbiamo un nome per una struttura dati che può contenere solo un elemento una volta: un insieme.

L'ho fatto e le attività mi piacciono molte volte. Ecco alcuni pseudocodici:

Array input = { ... };
Set output = ...;
for (int i : input) {
  output.add(i);
}
print output;

Inizializza la matrice e un set che conterrà i contenuti dell'array. Quindi itera l'array, aggiungendo ogni elemento al set. Se il set contiene già un elemento con lo stesso valore, non farà nulla. Una volta fatto, stampare il set. Conterrà ogni valore memorizzato nell'array un massimo di una volta.

    
risposta data 08.03.2015 - 03:26
fonte

Leggi altre domande sui tag