Con questo post inauguro una serie di post sulla risoluzione di problemi algoritmici che vengono spesso richiesti durante le interview. Il primo problema che affronto è scrivere un algoritmo per sapere se un numero è pandigitale che un numero che contiene tutte le cifre da 0 a 9 senza ripetizioni. Propongo varie soluzioni, tutte in C# in quanto è il linguaggio che mi è più comodo anche se la logica può essere facilmente implementabile anche in altri linguaggi senza alcun problema.
Array di booleani
In questa soluzione si evita l’utilizzo del dizionario utilizzando un array di booleani di dimensione 10. Questo array è quindi “automaticamente” popolato dalle cifre da 0 a 9 che sono gli indici di tale array. L’obiettivo è marchiare l’elemento corrispondente dell’array come true. Alla fine dell’iterazione per sapere se un numero è pandigitale basta verificare che tutti gli elementi dell’array siano veri.
Complessità spaziale e temporale
La complessità spaziale di questa soluzione è O(1) poiché utilizziamo solo un array di dimensioni fisse. La complessità temporale è O(n), dove n è il numero di cifre del numero dato in ingresso.
Lista
HashSet
Questo metodo sfrutta la proprietà degli Hashset
in quanto una ottima struttura dati per la verifica di elementi unici perché non permette elementi duplicati.
L’algoritmo inizializza quindi un HashSet
di interi allo scopo di sapere quali cifre ho trovato nel numero.
Alla fine dell’iterazione se la dimensione del set è 10 significa che ho tutte le cifre da 0 a 9.
Per ciclare tutte le cifre di un numero converto prima il numero in stringa con il metodo ToString()
, poi ne effettuo il foreach in modo da ciclare char
per char
e infine riconverto il char
in integer
.
Complessità spaziale e temporale
La complessità spaziale di questa soluzione è O(1) poiché utilizziamo solo un set di dimensioni fisse. La complessità temporale è O(n), dove n è il numero di cifre del numero dato in ingresso.
Singola riga
Grazie al costruttore di HashSet
posso inserire già il numero come array di char con lo skip automatico di eventuali duplicati.
Converto quindi il numero intero in ingresso in un array di caratteri con il metodo ToString()ToCharArray().
Ora devo solo verificare che l’HashSet contenga esattamente 10 elementi (quindi sono presenti tutte le cifre).