2010-03-03 13 views
12

Stiamo intervistando per un ruolo senior di sviluppo Java e tutte e tre le persone che abbiamo chiesto di completare questa domanda ci hanno dato la stessa risposta sbagliata. La domanda è stata fatta prima dell'intervista, quindi hanno avuto molto tempo. Le loro soluzioni sembravano ordinare l'input da parentId e childId invece di creare un albero e dall'input e quindi attraversare l'albero per trovare l'ordine corretto. La domanda non è abbastanza chiara?Quanto è chiara questa domanda di intervista?

Domanda:

Quello che segue è un test di abilità semplici e di presentazione per il ruolo dello sviluppatore Java che deve essere completato prima che l'intervista telefonica.

RICHIESTO:

  1. JUnit test

  2. Implementazione di interfaccia NodeSorter

DOMANDA:

Abbiamo un oggetto Java che sembra qualcosa di simile:

public class Node { 

    public int id; 
    public Integer parentId; 

    public Node(int id, Integer parentId) { 
     this.id = id; 
     this.parentId = parentId; 
    } 
} 

Ad esempio il seguente elenco di Node (s) potrebbe essere visualizzato graficamente come:

Node (id: 1, parentId: nullo), Node (id: 2, parentId: 1), Node (id : 3, parentId: 1), Node (id: 4, parentId: 2), Node (id: 5, parentId: 3)

   Node (id: 1) 
      /   \ 
      /   \ 
     /    \ 
     /    \ 
     Node (id: 2)   Node (id : 3) 
     /     \ 
     /     \ 
    /      \ 
    /      \ 
    Node (id: 4)     Node (id : 5) 

Ipotesi:

  1. ci saranno sempre almeno un nodo

  2. Ci sarà uno ed un solo nodo con un parentId nulla

  3. ogni nodo avrà un parentId valida eccezione per il nodo che ha un parentId nulla

Requisiti:

  1. Scrive una classe che implementa la seguente interfaccia che riceverà un elenco di nodi e li ordinerà dall'alto verso il basso (i nodi più alti nell'albero devono trovarsi prima dei nodi più in basso nell'albero. Per esempio. Il nodo 1 nella parte superiore dell'albero deve trovarsi prima del nodo 4 che si trova nella parte inferiore dell'albero). I nodi sullo stesso livello saranno in ordine di id, quindi il nodo con id = 2 apparirà prima del nodo con id = 3 nel diagramma sopra.

Interfaccia:

public interface NodeSorter { 
     public List<Node> sort(List<Node> unSortedNodes); 
    } 

Test Data:

Test Case 1:


Schema di ingresso:

   Node (id: 1) 
      /   \ 
      /   \ 
     /    \ 
     /    \ 
     Node (id: 2) Node (id : 3) 
     /     \ 
     /     \ 
    /      \ 
    /      \ 
    Node (id: 4)   Node (id : 5) 

ingresso: N ode (id: 2, parentId: 1), Nodo (id: 4, parentId: 2), Nodo (id: 1, parentId: null), Nodo (id: 3, parentId: 1), Nodo (id: 5, parentId: 3)

uscita: Node (id: 1, parentId: nullo), Node (id: 2, parentId: 1), Node (id: 3, parentId: 1), Node (id: 4, parentId : 2), Node (id: 5, parentId: 3)

caso test 2:


Schema di ingresso:

   Node (id: 1)  
      /   \ 
      /   \ 
     /    \ 
     /    \ 
     Node (id: 5) Node (id : 2) 
     /     \ 
     /     \ 
    /      \  
    /      \ 
    Node (id: 4)   Node (id : 3) 

ingresso: Nodo (id: 5, p arentId: 1), Nodo (id: 4, parentId: 5), Nodo (id: 1, parentId: null), Nodo (id: 3, parentId: 2), Nodo (id: 2, parentId: 1)

Output: Nodo (id: 1, parentId: null), Nodo (id: 2, parentId: 1), Nodo (id: 5, parentId: 1), Nodo (id: 3, parentId: 2), Nodo (id: 4, parentId: 5)

+28

quanto spesso risolvi questo problema nel lavoro per il quale stai intervistando? –

+0

realizziamo effettivamente alberi dai dati id/parentId nella nostra applicazione. ma per lo più ho scelto questa domanda perché pensavo che sarebbe stata ad un livello appropriato da quando mi è stata fatta una domanda simile a un'intervista che ho avuto. – benmmurphy

+8

ohh vendetta domanda uh? – OscarRyz

risposta

4

Mi sembra che tu stia essenzialmente chiedendo loro di ordinare una lista in base a due fattori: l'ID genitore e poi l'ID della lista. In questo caso, potresti semplicemente semplificare la domanda e non preoccuparti di tutta l'idea della "struttura ad albero" e chiedergli semplicemente di scrivere un ordinamento per un elenco basato su due fattori.

+3

L'ordinamento per ID genitore e quindi l'ID di lista non funziona, se i nodi non sono numerati in base alla loro collocazione in un albero (cioè genitore è ID 10, i bambini sono ID più piccoli). –

+0

questo è il motivo per cui sono preoccupato che la domanda non fosse abbastanza chiara perché non era quello che volevamo che facessero. puoi avere un genitore basso ed essere più basso nell'albero di un altro nodo che ha un genitore alto. è così che tutti i test case hanno funzionato se sono stati ordinati per parentId :( – benmmurphy

+2

Inizialmente mi mancava la qualifica "sullo stesso livello" nella dichiarazione dei requisiti, che spiegherebbe le risposte sbagliate. – reinierpost

3

È possibile chiedere loro di emettere i nodi in pre-ordine ordine di livello, in questo modo la domanda sarebbe cristallina.

+1

l'ordine è ordine di livello (http: //en.wikipedia.org/wiki/Tree_traversal). Forse altre prove che la domanda non è chiara :( – benmmurphy

+0

uh? Cosa è pre-ordine? – OscarRyz

+0

penso che il pre-ordine per il primo esempio sarebbe: 1 2 4 3 5 al contrario di: 1 2 3 4 5 – benmmurphy

11

Onestamente, la domanda mi sembra abbastanza chiara.

Hai provato a chiedere loro perché hanno scelto di ordinare per ID elenco e quindi ID nodo? Pensavano che questo risolvesse il problema? In tal caso, qual è la loro reazione di fronte a input per i quali non funziona?

Anche se non hanno risposto correttamente alla domanda, ponendo loro queste domande, puoi imparare di più su di loro e capire cosa nella tua domanda non è abbastanza chiaro.

+1

+1 Esattamente. Solo perché hanno una domanda sbagliata non significa che non sanno cosa sta succedendo. Discutere della loro soluzione ti dirà di più sull'intervistato piuttosto che solo "aver sbagliato" sul tuo problema. – Rich

14

Direi che questo è dannatamente poco chiaro. Vuoi un elenco non ordinato per l'input e un elenco ordinato come output.

Ogni elemento nell'elenco di output è un nodo ad albero, ma sull'albero non è applicato alcun saldo. L'utente non può semplicemente leggere i valori per tutti i nodi, ordinarli e quindi eseguire il loop sui valori ordinati creando nuovi nodi, ognuno dei quali punta al nodo precedente, ed essenzialmente da fare ... hanno creato un albero grossolanamente sbilanciato (senza rami), ma a chi importa?

Mi sembra corretto, ma se fossi intervistato non sarei molto contento di questa risposta, perché mi chiedevo perché l'albero fosse lì.

Nulla in questa domanda mi indica che dovrei fare qualcosa di simile a quello che stai suggerendo: "creare un albero e dall'input e poi attraversare l'albero per trovare l'ordine corretto".

+0

hai ragione che non è necessario creare un albero per ottenere la risposta corretta. una delle nostre soluzioni interne le ha ordinate per id figlio, quindi iterate sopra l'albero (senza crearne una) usando l'algoritmo di ricerca in ampiezza. – benmmurphy

+0

La domanda è abbastanza ambigua per me, dal momento che sembra che tu stia cercando una risposta specifica quando c'è più di un modo per risolvere il problema. Posso pensare a un modo per risolverlo usando un albero e un modo per risolverlo e creare l'albero dopo aver ordinato i nodi. – ChadNC

+0

Come affermato ora, è * non * ambiguo. – reinierpost

4

La domanda è chiara nell'input/output.

Quale struttura dati o algoritmo dovrebbe essere utilizzato nell'implementazione non è specificato, quindi è possibile utilizzarne uno (che è buono).

Se il codice risultante fornisce l'output previsto, è corretto, anche se non utilizzano un albero (perché non era nella specifica) se l'output è sbagliato, la soluzione è sbagliata, anche se usa un albero.

4

Penso che la domanda in sé sia ​​abbastanza chiara, ma la scelta dei dati nei casi di test sta portando le persone a tentare una soluzione errata (ordinamento per parentid). Forse questo è stato intenzionale?

Se si desidera rendere più probabile che i rispondenti ottengano la risposta corretta, è possibile includere un caso di test che dimostri che gli ID genitori possono essere più grandi degli ID figli.

Non sono sicuro che ciò migliorerebbe come una domanda di intervista, tuttavia: sembra che la domanda scritta abbia il vantaggio di testare la capacità di qualcuno di trovare una soluzione corretta per tutti i casi, non solo per i campioni sono forniti.

0

Hai fornito esempi di input e output agli intervistati come hai fatto tu nel post qui? Se si limitano a dare le regole senza un esempio, penso che qualcuno potrebbe essere perdonato per incomprensioni.

Personalmente, penso che sia una buona domanda. È abbastanza semplice che non stai chiedendo al richiedente di passare giorni a lavorarci, ha un output corretto e ben definito e una soluzione corretta dimostra una conoscenza di come manipolare le strutture dati, che è piuttosto semplice per un buon sviluppatore. E vedo che hai detto che hai chiesto ai candidati di farlo prima dell'intervista telefonica, che io prendo significa farlo a casa, quindi non sono seduti in una stanza con un'intervista che li fissa mentre lottano e quindi sotto pressione artificiale .

L'unico vero difetto che vedo è che non mi è chiaro quale sia l'input. Dici che l'input è un elenco di nodi, apparentemente oggetti Node, ma come fa il programmatore a garantire che questo elenco di nodi formi effettivamente un albero? Dovrebbe semplicemente presumere che sia tutto un input valido? O dovrebbe convalidarlo? Penso che sarebbe meglio dire che la funzione deve accettare il nodo radice di un albero e quindi scoprire quali nodi esistono per attraversamento, piuttosto che fare il doppio problema di fornire l'elenco e forzare il programmatore a dare un senso a esso.

È molto meglio della maggior parte delle domande di intervista che ho ricevuto nella mia vita, che tendono ad essere domande come "Quanti anni hai esperienza con ...", "Qual è il tuo più grande errore come un impiegato? ", e" Hai esperienza con Foobar versione 3.9.7.6? Oh, hai usato solo la versione 3.9.7.5, scusa, qui usiamo 3.9.7.6 ".

Il mio unico cavillo è, che cosa ha a che fare questa domanda con il test di JUnit? Cominci dicendo che si tratta di test di JUnit, ma non vedo come si riferisca a questo.

0

La domanda è CLEAR. Stai chiedendo quindi BFS dell'albero.

È una domanda interessante per la revisione di 1) capacità di astrazione; 2) ordine e stile nella programmazione 3) attenzione per l'ordine dell'algoritmo (il big-O).

La mia risposta per tutto ciò che "quante volte si fa a farlo nel tuo lavoro" commenti è:

  • questa domanda intende valutare:
    • la capacità di astrazione
    • la teoria sfondo
    • uso di algoritmi e strutture dati

Se riesci a farlo, allora non sei un semplice database-systems-oriented-basic-programmatore.

9

Informazioni sull'aggiornamento dei casi di test per aggiungere test che potrebbero fallire a causa delle soluzioni errate fornite?

Sembra che sarebbe un modo ovvio per rendere la domanda un po 'più chiara. E poi se ancora non capiscono la domanda o trovano poco chiara data la domanda/i casi di test forniti possono richiedere ulteriori informazioni prima di completare la loro soluzione.

+0

Non potrei essere più d'accordo. –

+0

Ha senso per me. – Beska