Recentemente, in un'intervista, mi hanno fatto domande tecniche. Uno era come dovresti calcolare quale numero in una lista di lunghezza n-1 mancava. L'elenco conteneva tutti i numeri da 1 an, tranne i dove 1 < = i < = n. I numeri non erano in ordine. La mia soluzione era di aggiungerli tutti, quindi sottrarre quella dal calcolo dei numeri da 1 a n, aggiungendo 1 a n e moltiplicando per n/2 o (n-1)/2 come appropriato. Ma ho avuto la sensazione che esistesse un modo migliore per farlo. Qual è la soluzione ottimale?Qual è il modo ottimale per calcolare quale numero intero in una lista manca?
risposta
La tua risposta è abbastanza buona, secondo me.
Ma alcune persone - forse il tuo intervistatore è uno di loro - sono preoccupate per l'eccedenza e così via. In tal caso, utilizzare XOR anziché l'aggiunta.
Per ottenere lo XOR degli interi da 0 a n, basta XOR insieme gli indici di matrice durante il ciclo. Dato lo XOR degli interi da 0 a n, e lo XOR degli elementi dell'array, basta XOR i due di questi insieme per ottenere l'elemento mancante.
P.S. La somma dei numeri interi da 1 a n è sempre (n + 1) * n/2
Mi piace il tuo trucco XOR! È interessante, tuttavia, che non è necessario preoccuparsi dell'overflow per risolvere il problema, purché si sappia che il sistema mantiene i bit inferiori corretti del risultato. sottrarre la somma calcolata (straripante) dei numeri dalla somma (anche sommatoria) calcolata usando il metodo gaussiano e, sorprendentemente, otterrai il numero! Il trucco non funzionerà se il sistema verifica sempre l'overflow dei numeri interi (ad esempio, Ada). Non funzionerà anche sui float, ma nemmeno sul trucco XOR. Il trucco XOR richiede un passaggio sull'array, a meno che non ci sia una formula chiusa come quella per la somma. – kkm
@kkm: il metodo gaussiano evita solo il problema di overflow se si esegue prima il calcolo (n/2) o (n + 1)/2 (qualunque sia un numero intero). Se moltiplichi n per n + 1, perdi il bit più alto e non puoi recuperarlo quando dividi per 2. Ma sì, a parte questo, facendo la somma modulo 2^k funziona bene. – Nemo
mentre si scorre l'array per calcolare la somma, è possibile verificare se un numero si sta ripetendo.
Potresti espanderti, non riesco a vedere cosa intendi. – CSturgess
nella tua risposta hai menzionato che la soluzione può essere calcolata calcolando la somma e quindi sottrandola dal totale. per calcolare la somma devi iterare pensato alla matrice. – KItis
Sì, ma cosa vuoi dire ripetere? I numeri non si ripetono. – CSturgess
Il tuo metodo è assolutamente valido. È ottimale in termini di spazio e tempo. L'overflow può essere l'unico problema con esso.
Un altro metodo possibile potrebbe essere l'utilizzo di un hashSet. Creare un hash iniziale con valori 1-> N. Ora per ogni numero che incontri nella lista - cancella quel valore dal hashSet. Alla fine, il valore che rimane nell'hashSet è il valore mancante.
Questo metodo è O (N) nella complessità di tempo e spazio. Il tuo metodo (con esclusione del limite) era O (N) nel tempo e complessità O (1). Il fattore "n" aggiunto per lo spazio è il costo per eliminare l'overflow.
La soluzione è più o meno ottimale con una modifica, come sottolinea @Nemo la somma di numeri interi da 1 a n è sempre (n+1) * n/2
Vale anche la pena sottolineare che il vostro approccio è multi-thread in grado (e potrebbe adatto per valori molto grandi di N), dividere l'array in parti, quindi ottenere la somma di ogni parte di matrice in un thread, quindi aggiungere le somme di parti. Dipende da quale sovraccarico di threading viene confrontato con l'aggiunta di numeri in un array.
Se siete preoccupati per overflow, e i valori sono sempre Int32 (come la maggior parte dei valori .Length
sono compresi gli array) poi basta memorizzare la somma come un Int64, la somma di tutti i valori intero positivo (((long)int.MaxValue) +1L) * (int.MaxValue/2) = 2305843007066210304
che è ancora in grado di adattarsi all'interno di un int64 con un .MaxValue = 9223372036854775807
.
L'altra risposta come menzionata da altri è quella di XOR ogni elemento e mantenere un XOR in esecuzione, ma poi è necessario elaborare una formula per ottenere lo XOR totale previsto nel tempo O(1)
.
Molto probabilmente l'intervistatore sta cercando di vedere se ti rendi conto c'è una soluzione O(N)
con O(1)
di memoria (che la vostra risposta è), piuttosto che l'ordinamento della matrice e di essere molto più lento per grandi valori di N
.
Per migliorare ulteriormente la soluzione nel codice, sarebbe opportuno utilizzare un puntatore per accedere alla matrice anziché al valore dell'indice (che se il codice è C# sarà un miglioramento ragionevole).
- 1. algoritmo ottimale per calcolare il risultato di una frazione continua
- 2. Qual è il modo ottimale per calcolare un hashcode per un set di punti?
- 3. Qual è il modo ottimale per gestire le immagini rotte?
- 4. Qual è il modo più veloce per calcolare una grande potenza di 2 modulo un numero
- 5. Quale numero intero restituisce DateTime.CompareTo?
- 6. In JavaScript/jQuery qual è il modo migliore per convertire un numero con una virgola in un numero intero?
- 7. Qual è il modo migliore per ottenere il numero ottimale di argomenti per un modello LDA utilizzando Gensim?
- 8. Qual è un modo migliore per verificare se una stringa è un numero intero su iPhone?
- 9. qual è l'algoritmo per riempire in modo ottimale un dvd per la masterizzazione
- 10. Qual è il limite di auto_increment (numero intero) in mysql
- 11. Qual è il modo migliore per determinare il numero di thread da attivare in una macchina con n core? (C++)
- 12. Qual è il modo ottimale per estrarre i valori tra parentesi graffe in bash/awk?
- 13. Quale tipo di dati è un numero intero in #define?
- 14. Qual è il modo più veloce per calcolare la distribuzione di frequenza per array in C#?
- 15. Qual è il modo migliore per calcolare la dimensione di una directory in VB .NET?
- 16. Qual è il modo consigliato per verificare che una lista sia una lista di numeri in argomento di una funzione?
- 17. Quale interpolazione è ottimale per la rotazione dell'immagine?
- 18. Qual è l'ordine ottimale dei membri in una classe?
- 19. Quale metodo si usa per selezionare il numero ottimale di cluster in k-means e EM?
- 20. Qual è il modo pitone di controllare se un oggetto è una lista?
- 21. Qual è il modo più ottimale per sostituire l'intero '0' con '1' in C++
- 22. Qual è il modo migliore per enumerare una lista in linguaggio naturale (Scala)?
- 23. qual è il modo migliore per calcolare il valore_atteso nel metodo assertEquals() in jUnit
- 24. Qual è il modo LINQ per farlo
- 25. Quale bit è avanti per un intero in Java
- 26. Qual è il modo ottimale per confrontare le date nel server Microsoft SQL?
- 27. Il metodo migliore per verificare se un oggetto in una lista è l'ultimo (per data)
- 28. Qual è il modo ottimale per animare un disegnabile all'interno di una vista utilizzando le classi di animatori?
- 29. Qual è il numero di articoli bulk ottimale con il metodo InsertBatch nel driver mongodb C#?
- 30. Il modo più veloce per calcolare una maschera di bit X-bit?
Considerare l'aspetto del campo se lo si ordina. Se riesci a pensare a una parola che inizia con "P", sei sulla strada giusta. –
Ma non ordinarlo richiede più lavoro del mio metodo? (E mi dispiace, non riesco a pensare alla parola) – CSturgess
Non sto dicendo che lo smistamento è la risposta, solo che dovresti pensare a come sarebbe. La seconda lettera è "e". –