Classifica domande intervista FizzBuzz (1), implementando malloc (10) [chiuso]


10

Mi piacerebbe avere la tua opinione sulla difficoltà della seguente domanda di intervista:

Trova il sottoarray contiguo con la somma massima in una matrice di numeri interi in O (n) tempo.

Questo banale problema di suono è stato reso famoso da Jon Bentley nelle sue perle di programmazione dove lo usa per dimostrare le tecniche di progettazione degli algoritmi.

Su una scala 1-10, 1 essendo il test FizzBuzz (o HoppityHop ) e 10 implementando la funzione C stdlib malloc (), come classificheresti il ​​problema sopra?

Penso che le persone che possono meglio rispondere a questa domanda siano quelle che hanno letto Programmare Perle e hanno cercato di risolvere questo problema da sole. Per motivare coloro che non lo hanno fatto, "Programming Pearls" viene messo in evidenza molte volte nell'elenco "I 10 libri di programmazione".

Un paio di commenti potrebbero aiutare a ottenere una valutazione migliore:

  • L'implementazione di malloc () non è così formidabile come sembra. Vedi ad esempio il linguaggio di programmazione C di K&R. A volte viene chiesto a Microsoft .

  • Osservazione del CLRS sulla risoluzione dei problemi: spesso è più difficile risolvere un problema da zero piuttosto che verificare una soluzione chiaramente presentata, specialmente quando si lavora con vincoli temporali .


12
La difficoltà qui è che numeri interi possono essere negativi? (altrimenti l'intero array è sempre il subarray più grande, quindi O (1) :-P)
Macke,

4
Il problema dovrebbe dire "Trova il
subarray

6
Non farei "in O (n)" un requisito in un'intervista. Puoi iniziare con una soluzione ingenua e poi perfezionarla se vuoi, ma non mi aspetto che qualcuno sia in grado di ricavare una soluzione O (n) in un'intervista di 1 ora senza precedente esposizione a questo algoritmo.
Dean Harding,

2
Giusto. Questo è un problema semplice se si consentono soluzioni O (n²).
dan04,

@ Decano, spero che sarebbero in grado di spostare una somma di tipo aveerage corrente dalla posizione j alla j + 1 in O (1). Forse per essere onesti, questo può essere fornito come un suggerimento. (Suppongo che la lunghezza del subarray sia stata prespecificata)
Omega Centauri,

Risposte:


17

Dipende molto dallo sviluppatore.

Se malloc fosse 10 allora valuterei questo problema come 20. Ma poi ho già fatto malloc prima e probabilmente potrei farlo di nuovo.

Qualcuno che ha fatto questo problema o conosce l'algoritmo appropriato della parte superiore della testa lo renderà un 5 e malloc () un 10.

Il problema con questo tipo di domanda è che se le hai fatte prima sono facili e questo è davvero un test per vedere se hai già visto questo algoritmo. Quindi non mi piacciono per le interviste.

Ora, per i test in cui dai allo sviluppatore un paio di giorni, è un test perfettamente valido perché se non conoscono l'algoritmo, dai loro la possibilità di fare la ricerca e aggiornarti ed è un test non solo la tua conoscenza ma la tua capacità di acquisire nuove conoscenze.


weather -> se nel quarto paragrafo (e scusate il rumore, non ho il rappresentante per fare errori di battitura ...)
Matthieu M.

Martin, penso che dipenda dal tipo di applicazione per cui stai intervistando le persone. Per i tipi di sistemi malloc è piuttosto semplice. Per me -Sono bloccato, [presumo che l'indirizzo e la lunghezza dello stack ecc. Siano stati deliberatamente nascosti da me] con malloc, ma il problema del subarray è quasi banale. La chiave sta abbinando le domande alle esigenze del lavoro.
Omega Centauri,

8

Immagino che la valutazione dovrebbe essere bidimensionale, almeno. FizzBuzz- mallocdescrive la gamma su un asse, la definirei "complessità tecnologica". Ma questa singola dimensione non è certamente sufficiente per descrivere il problema. Per risolvere il problema in questione, lo sviluppatore dovrebbe pensare più del codice , mentre l'implementazione mallocrichiede più disciplina del codice che creazione di algoritmi complessi.

Quindi ecco come organizzare questi problemi:

inserisci qui la descrizione dell'immagine

Per illustrare il mio punto, ho aggiunto l' ordinamento in parallelo alla trama, poiché, immagino, sia un buon esempio di attività sofisticata sia tecnologicamente che algoritmicamente.


2

Penso che sia considerevolmente più difficile di FizzBuzz o HoppityHop: quei due non sono altro che un semplice if-else o switch-case in un ciclo.

L'array secondario massimo richiederà un'analisi più approfondita del problema di fondo - non è qualcosa che ti aspetteresti di vedere in una classe di programmazione per principianti in quanto richiede abilità matematiche più elevate di un problema di tipo FizzBuzz. Questo problema ha una sensazione simile al problema del percorso più breve, che è risolto dall'algoritmo di Dijkstra - forse è una specializzazione del problema del percorso più lungo .

Sulla tua scala da 1 a 10 probabilmente lo classificherei tra 3 e 5.

* Mentre il server era inattivo, ho scoperto che il problema del subarray massimo ha una sua pagina su Wikipedia.


Qualcuno può spiegare perché è necessario l'algoritmo descritto su Wikipedia, quando il seguente algoritmo concettualmente molto più semplice funziona per me: In un unico passaggio, calcola la somma cumulativa, trovando il minimo e il massimo nel solito modo. La somma massima di sottosequenza consecutiva inizia dopo l'indice cumsum minimo e si estende fino all'indice cumsum massimo incluso.
Ben Voigt,

2
@Ben Voigt: prova la sequenza {+2, -4, +1} o {+1, +1, -1, -1, -1, -1, +1}. In realtà, il metodo Kadane è molto semplice: esegue la scansione dell'array una sola volta e mantiene aggiornate tre variabili nello stile della programmazione dyanmic.
rwong

@rwong: ah ok, Kadane è necessario nel caso in cui il minimo arriva dopo il massimo. E conto 5 variabili, non 3, più l'indice del ciclo.
Ben Voigt,

@Ben: hai ragione, sono 5 variabili più l'indice del ciclo.
rwong,

1

Ne do un 3. Oltre alla maggior parte dei programmatori che ho intervistato, ma un problema facile per quelli che ho raccomandato di assumere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.