Jaki jest twój ulubiony problem z rozmową na tablicy? [Zamknięte]


52

Jak mówi tytuł, jaki jest twój ulubiony problem z wywiadem na tablicy i dlaczego okazał się dla ciebie skuteczny?

Junior, senior, Java, C, JavaScript, PHP, SQL, pseudo-kod itp.


4
Problemem, którego nienawidziłem, była Układanka Einsteina. stanford.edu/~laurik/fsmbook/examples/Einstein'sPuzzle.html Nie mogłem tego zrobić w 30 minut. Ale potem się wkurzyłem i znalazłem to: games.flowix.com/en/index.html Więc trenowałem robić trudniejszy problem 6 x 6 x 6 średnio w 20 minut. Myślę, że poradzę sobie 5 x 5 x 5 w 30 minut. Wszelkie głupie łamigłówki, które rzuci na mnie pracodawca - zapamiętam je i pokręcę następnym razem. Jest tyle dobrych łamigłówek.
Job

20
@Job: Żadne z nich nie powie nic o tym, jak pracownik wykona pracę. O ile oczywiście nie spędzasz całego czasu na rozwiązywaniu tego rodzaju łamigłówek zamiast na wykonywaniu rzeczywistej pracy.
Robert Harvey

1
@Robert Harvey masz na myśli, że prowadzisz firmę, która zarabia pieniądze w inny sposób niż rozwiązywanie zagadek? Nie miałem pojęcia ...;) Ta łamigłówka jest fajna. Na marginesie, firma, w której pracowałem, wykorzystywała rzeczywiste testy IQ jako pierwszy krok w ich badaniach przesiewowych. Chciałbym znaleźć kilka dobrych pytań na tablicy, aby oddzielić najlepszych kandydatów, a nie tylko ich przesłać.
Nicole

4
@Reneesis: Jako programista widzę, jak rozwiązywanie układanki identyfikuje umiejętności rozwiązywania problemów i analizy, ale programiści muszą także wiedzieć, jak przełożyć to rozwiązanie na kod. Rozwiązanie zagadki pokazuje tylko połowę tego wykonania. Jest to różnica między rozwiązywaniem kostki Rubix a pisaniem algorytmu do rozwiązania kostki Rubix.
Robert Harvey

@Robert Harvey Zgadzam się, szczególnie szukam problemów z kodowaniem, a nie tylko problemów z myśleniem.
Nicole

Odpowiedzi:


22

Proszę kandydata o zaprojektowanie rozwiązania problemu, z którym faktycznie spotkałem się w codziennej pracy. W ten sposób staram się stworzyć dialog między mną a kandydatem. Próbuję dyskutować o projekcie, który buduje, jakbym nigdy wcześniej nie myślał o problemie.

Próbuję ocenić, czy jesteśmy w stanie się zrozumieć i czy możemy rozmawiać o problemie technicznym bez zamieszania.

Konkretny przykład

(Dla programistów Java)

Zaprojektuj interfejs API do obsługi historii nawigacji przeglądarki internetowej (poprzednia strona, następna strona, wymień 10 poprzednich stron), która może być ponownie wykorzystywana w wielu częściach aplikacji (tutaj podam konkretne przykłady w naszej aplikacji). Następnie naszkicuj implementację.

Podoba mi się ten, ponieważ jest dość prosty, łatwy do zilustrowania, można go rozwiązać krok po kroku (dodawać dodatkowe zachowania bez rozbijania wszystkiego), pozwala rozmawiać o przypadkach na krawędziach i obsłudze błędów, a także pozwala rozmawiać o danych Struktury.


40

Przekonałem się, że jest to niezwykle pouczające podczas przeprowadzania wywiadów z kandydatami i odfiltrowywania tych, którzy nie mają interesu. Jego złożoność jest podobna do Fizz Buzz, ale koncentruje się na umiejętnościach bazodanowych.

Assuming the following basic  table structure
Documents (DocID, DocDate)
Keywords (KeyWordID, KeyWord)
DocumentKeywords (DocID,KeywordID)

Write a query to return the following:
Part 1: Documents with a DocDate after 4/1/1995  
Part 2: Documents that contain the keyword "Blue"  
Part 3: Documents that contain the either the keyword "Blue" or "Yellow"
Part 4: Documents that contain the both the keywords "Blue" and "Yellow"

Pozwalam im napisać to w dowolnym wariancie SQL, jaki chcą, i nie jestem zbyt wybredny w kwestii drobnych problemów ze składnią. Chcę przede wszystkim wiedzieć, że rozumieją podstawowe koncepcje relacyjnych baz danych.

Większość kandydatów może przejść przez część 3 bez żadnych problemów. Byłbyś zaskoczony, jak wielu uważa, że ​​odpowiedzią na część 4 jest po prostu zmiana operatora z OR na AND w klauzuli where.


2
Ach, widzę problem w / # 4. Twoje dokumenty zawierają tylko jedno słowo kluczowe w wierszu, więc nie możesz mieć komórki równej zarówno kranowi „Niebieskiemu”, jak i „Żółtemu” świadomie
glasnt,

8
Ups! Widzę, że zakochuję się w (4) w wywiadzie. @Job: Jako ankieter poprosiłbym kandydata o wyjaśnienie pytania, mając nadzieję, że potknie się o swój problem i zobaczy, jak sobie z tym poradzi . (to zwykle mówi więcej niż kandydat, który zadaje pytania przy pierwszej próbie).
peterchen

3
@Reneesis, nie jestem pewien, czy to jest naprawdę głębokie. To wydaje się całkiem dobre, aby dowiedzieć się, czy ktoś ma podstawowe umiejętności obsługi zapytań SQL. Tak naprawdę jestem zszokowany tym, jak niewielu programistów ma te podstawowe umiejętności.
Mark Freedman,

2
@ jk01, może mam staroświecką postawę w tej sprawie, ale IMO, dobrze rozwinięty programista, powinien mieć trochę wiedzy na temat DB, jeśli nie ma dostępu do kodu, ale przynajmniej do zrozumienia domeny poprzez eksperymentowanie z zapytaniami. Bez tego programista ma dość znaczącą martwą pozycję. Jest również niezwykle przydatny do obsługi systemu i rozwiązywania problemów. Abstrakcja jest w porządku, aby uprościć rozwój i zwiększyć produktywność, ale widziałem zbyt wiele założeń, ponieważ tak często jest to abstrakcyjne. Mógłbym kontynuować, ale to może być zupełnie inna debata, jestem pewien, że odbywa się gdzie indziej;)
Mark Freedman,

4
@ back2dos - Słuchaj, nie obrażaj się tylko dlatego, że nie możesz odpowiedzieć. Może być wiele innych technologii, które upraszczają to, ale korzystamy z wielu baz danych SQL i rekrutuję ludzi, którzy wiedzą, jak korzystać z technologii, których używamy, a nie usprawiedliwiam, dlaczego nie powinni odpowiadać na pytania podczas rozmowy kwalifikacyjnej .
JohnFx,

20

„Narysuj mi na tablicy projekt ostatniego projektu, nad którym pracowałeś, nie ujawniając mi żadnych wrażliwych szczegółów.”


Jak zdefiniowałbyś projekt? Szukasz schematu klasowego? Kolejny diagram UML? Podstawowy szkic poziomów?
justkt

1
Nazywam je baloongrami. ;) Wystarczy narysować cykle, umieścić nazwy i połączyć je nazwanymi strzałkami. Nie obchodzi mnie jego podanie, ale fakt, że on to zrozumiał.
Uberto,

5
+1. Dla osób, które wcześniej pracowały, jest to zdecydowanie jedna z najlepszych rzeczy, jakie możesz zrobić. Jeśli potrafią wyjaśnić, w jaki sposób projekt został skonstruowany, to i tak jest on dużo wart. Jeśli mają pomysł, dlaczego został on skonstruowany w ten szczególny sposób, lub w jaki sposób niektóre rzeczy można zrobić lepiej, to jest to naprawdę ogromny plus.
back2dos,

3
@justkt: Ważne jest, aby osoba udzielająca wywiadu uzyskała informacje w poprzek. Nie ma znaczenia jak. Spotkałem ludzi, którzy naprawdę znają UML, którzy nie potrafią nic z tym wytłumaczyć, i ludzi, którzy potrafią wyjaśnić złożone systemy kilkoma dziwacznymi liniami.
back2dos,

2
Jak, u licha, ktoś ma narysować projekt projektu, nie ujawniając żadnych wrażliwych szczegółów?
Nemanja Trifunovic

14

Wdrożyć strcpy, strcmpi przyjaciół.


4
Proszę kandydatów o wdrożenie atoi().
chrisaycock

2
Byłbyś zaskoczony, jak wiele osób nie może wdrożyć strdup().
Tim Post

10
To jest sprawiedliwe tylko wtedy, gdy otwarcie pracy jest dla programisty C.

W rozmowie dotyczącej mojej bieżącej pracy ankieter poprosił mnie o wdrożenie strrev()lub odwrócenie ciągu znaków. Moje rozwiązanie białej tablicy zrobiło na nich wrażenie i teraz wykonuję pracę.
Gulshan,

@crisaycock atoi () jest łatwe. itoa () jest przebiegły
Michael Brown

14

Moim ulubionym, który obejmuje kilka dyscyplin, jest policzenie liczby węzłów w drzewie binarnym, biorąc pod uwagę interfejs (w C #):

public interface IBinaryTree<T>
{
    IBinaryTree<T> Left
    {
        get;
    }

    IBinaryTree<T> Right
    {
        get;
    }

    T Data
    {
        get;
    }

    // Other properties and methods not germane to this problem.
}

i dla zabawy, oto implementacja, choć rozmówca nie musi tego widzieć.

public sealed class BinaryTree<T> : IBinaryTree<T>
{
    private readonly IBinaryTree<T> left;

    private readonly IBinaryTree<T> right;

    private readonly T data;

    public BinaryTree(
        IBinaryTree<T> left,
        IBinaryTree<T> right,
        T data)
    {
        this.left = left;
        this.right = right;
        this.data = data;
    }

    public IBinaryTree<T> Left
    {
        get
        {
            return this.left;
        }
    }

    public IBinaryTree<T> Right
    {
        get
        {
            return this.right;
        }
    }

    public T Data
    {
        get
        {
            return this.data;
        }
    }

    // Other properties and methods not germane to this problem.
}

i klasa asystenta:

public static class BinaryTreeNodeCounter
{
    public static int CountNodes<T>(this IBinaryTree<T> tree)
    {
        // TODO: What goes here?
    }
}

Rozwiązanie, które lubię, to:

public static class BinaryTreeNodeCounter
{
    public static int CountNodes<T>(this IBinaryTree<T> tree)
    {
        return tree == null
            ? 0
            : 1 + tree.Left.CountNodes() + tree.Right.CountNodes();
    }
}

Jak pokazuje znajomość:

  • jak działa drzewo (w szczególności drzewo binarne)
  • rekurencyjna definicja drzewa binarnego
  • metody rekurencyjne i jak przypadki podstawowe zatrzymują rekurencję
  • co oznacza liczenie pojedynczego węzła
  • interfejsy jako umowa
  • (mniej ważna) znajomość składni C #:
    • generyczne
    • metody rozszerzenia
    • operator trójskładnikowy

Czy może to być metoda rozszerzenia?
Gulshan,

W dzisiejszych czasach tak. W tym czasie kodowaliśmy w VS 2005, stąd rzadka składnia.
Jesse C. Slicer,

Po co używać metody rozszerzenia, skoro masz kod źródłowy oryginalnej klasy? Nie do tego służą metody rozszerzenia.
Batibix,

„mogłem zejść o jeden poziom głębiej i pokazać kandydatowi interfejs, który implementuje ta klasa. Istotą jest to, że oryginalna klasa nie powinna wymagać modyfikacji - niektórzy programiści z klasy podstawowej chcieliby dodawać elementy do klasy, aby żądanie było łatwiejsze.
Jesse C. Slicer,

cholera, która wygląda jak java!
test

12

Są dwa pytania, które wywołały dla mnie interesujące dyskusje na tablicy

  1. „Czy możesz szczegółowo wyjaśnić, w jaki sposób przeglądarka internetowa generuje wygenerowaną stronę”
  2. „Wyjaśnij, jak działa Java Hibernacja”

Zaczynają od prostych, a następnie stają się coraz bardziej złożone.


31
ehi, nie mam nawet kwalifikacji, by oceniać odpowiedzi ... Myślę, że do drugiego potrzebujesz 12 czarnych świec i kozła ...
Uberto,

4
Drugi jest łatwy, system operacyjny zapisuje pamięć podręczną procesora i stos oraz zawartość pamięci RAM na dysk twardy, a następnie przywraca ją po ponownym włączeniu komputera.
Malfist,

Pierwsze pytanie może jednak zająć kilka dni.
Malfist,

@Malfist Miałem na myśli framework trwałości Java Hibernate.
Gary Rowe,

2
@Paul Stephenson Tak, ale dla pewności ...
Gary Rowe

8

Nie lubię łamigłówek ani pytań projektowych jako pytań na tablicy. Wolę proste, proste pytania, które sprawdzają zdolność kandydata do napisania kodu. Moje ulubione to:

1) Napisz funkcję, aby odwrócić pojedynczo połączoną listę. (Zajmuje trochę czasu, zanim zdają sobie sprawę, że potrzebują 3 wskaźników).

2) Biorąc pod uwagę drzewo binarne, znajdź głębokość drzewa binarnego. (To pytanie sprawdza ich zdolność do pisania kodu rekurencyjnego. Pozwala mi sprawdzić, czy nie zachowała się ich przypadek podstawowy).

3) Napisz procedurę binarnego przeszukiwania tablicy liczb całkowitych. (Jak mówi Jon Bentley (w Programming Pearls), wiele osób popełnia błędy, pisząc wyszukiwanie binarne. Następnie można znaleźć błędy, pisać przypadki testowe, przeglądać kod itp.)


+1, podoba mi się, że twoje podejście nie ma sensu pytać kogoś Dynamicznego programisty lub takiego pojęcia, gdy są one rzadko używane w programowaniu biznesowym. + Nacisk powinien być położony również na jakość kodu, a nie na samo rozwiązanie.
Geek

Nie mam nic przeciwko projektowaniu pytań, ale kiedyś przeprowadziłem wywiad z facetem, którego hobby polegało na układaniu puzzli, a on miał kilka okropnych pytań. To było jakbym zadawał komuś pytania dotyczące sztuk walki.
Bob Murphy

Prawdopodobnie powinien upewnić się, że ludzie wiedzą, że masz na myśli „posortowaną tablicę” w (3), prawda?
HaveAGuess,

7

Wykorzystaliśmy to w jednej firmie, w której pracowałem.

Wręczyliśmy kandydatowi kawałek papieru służący do śledzenia czasu. To był prawdziwy grafik wykorzystywany przez jeden lub nasz oddział. Poprosiliśmy kandydata, aby przeprowadził nas przez proces projektowania w celu stworzenia lepszego narzędzia do śledzenia czasu. Bez granic, nie powiedziałem, w jakim języku itp., Chcę tylko zobaczyć, jak dobry był kandydat w „pełnym cyklu życia”. Dało nam to prawdziwy wgląd w to, jak zbierali wymagania. Jak ustrukturyzowali tabele bazy danych, jaki interfejs użytkownika mogą zrobić. Do tego zadania były oczywiście potrzebne umiejętności komunikacyjne. Zwykle odbywało się to w pomieszczeniu z kilkoma dużymi białymi tablicami i trwało nawet 2 godziny.

Zatrudniliśmy kilka osób korzystających z tego procesu i jeśli naprawdę dobrze poradziły sobie z tym zadaniem, zrobiły nam naprawdę dobrze. Jeśli były marginalne, a mimo to postanowiliśmy ich zatrudnić (osobny temat), to byli marginalnymi programistami.


6

Używam problemu związanego z moją domeną programistyczną.

Jeśli tworzę aplikacje internetowe, chcę zobaczyć, jak mogą sporządzić formularz internetowy, który usuwa rekordy, i jakie podejście mogą zastosować na przykład do usunięcia rekordu z bazy danych. To mówi mi, czy znają podstawowe zasady bazy danych, jak wchodzą w interakcję z użytkownikiem w celu weryfikacji usunięcia i czy wiedzą, co to jest miękkie usunięcie.

Nie mam ulubionego. Problem, który wybiorę, będzie się znacznie różnić w zależności od pracy.

Nie dbam o to, czy potrafią rozwiązać problem całkowicie, czy nie w wywiadzie, jakich technologii i języków używają lub jak kiepski jest ich kod na tablicy. Szukam wzoru myśli; Chcę sprawdzić, czy wiedzą, jak przemyśleć i rozwiązać problemy.


2
+1 Za ostatni akapit, który jest ważny. Zwykle nie jest to odpowiedź, która ma znaczenie w takich sprawach, ale ścieżka podążająca w tym kierunku. Jak wszyscy moi nauczyciele matematyki mówili „pokaż swoją pracę!”
Orbling

4

Moim ulubionym był mój przyjaciel.

Napisz mi funkcję do generowania / drukowania / przechowywania pierwszych liczb pierwszych n, a następnie wyjaśnij, jak to działa i jak wydajna.

Działa dobrze, ponieważ:

  1. Jest to pytanie algorytmiczne, więc osoba, z którą rozmawiasz, musi myśleć, a następnie wyjaśnić swoje myślenie - abyś mógł zobaczyć, jak działa ich mózg.

  2. Jest niezależny od języka.

  3. Prawie nikt nie rozumie tego całkowicie poprawnie (zwykle brakuje przypadkowej przewagi (zwykle 1 lub 2) lub nie obsługują liczb ujemnych, więc możesz zobaczyć, jak radzą sobie z błędami i powiedziano im, że się mylą.

  4. Większość robi to jako proste, ale bardzo powolne sito (np. 80% ludzi sprawdzi, czy n jest liczbą pierwszą dzieląc n przez wszystkie liczby całkowite mniejsze niż n), co daje dużo miejsca na rozmowy na temat tego, jak mogliby ulepszyć algorytm na kompromisach czasoprzestrzennych np. „dlaczego dzielisz liczbę przez 4, jeśli już wiesz, że nie można podzielić przez 2?” lub „Przekonałeś się, że wystarczy podzielić przez wszystkie liczby pierwsze mniejsze niż sqrt (n), ale to wymaga zapisania gdzieś tych liczb, więc jakie są tego konsekwencje?”)

Nie ma potrzeby, aby poprawnie uzyskiwali odpowiedź. Jeśli ktoś może pomyśleć i wytłumaczyć swoje myślenie, jest na dobrej drodze do bycia dobrym kandydatem.


Kiedyś dostałem pytanie do wywiadu, w którym otrzymałem bardzo zaciemniony blok kodu C i poprosiłem o sprawdzenie, co on zrobił. W bardzo okrągły sposób wydrukował każdą inną liczbę pierwszą. Zgłosiło się 300 osób, które zaproponowały mi tę pracę, ponieważ najwyraźniej byłem jedynym kandydatem, który powiedział im, jaki jest jej cel, a nie ujawnienie wartości. Tak, +1, liczby pierwsze są dobrym czekiem. Zwłaszcza jeśli wymyślą sito, które zamienia złożoność obliczeniową na złożoność przestrzeni.
Orbling

1
1 nie jest liczbą pierwszą.

2
@ Thorbjørn - oczywiście, ale spory odsetek procedur, które widziałem napisane w celu rozwiązania tego problemu, powiedział mi, że tak jest
Rhys Gibson

wtedy mają błąd :)

3

Coś o nazwie aff_z, które było częścią egzaminów C mojej szkoły inżynieryjnej i zostało użyte jako test „obojętny”, aby uczniowie nie powrócili z wakacji (nasz system oceniania sugerował, że niepowodzenie testu zatrzymało oznaczanie, więc niepowodzenie tego testu obojętnego unieważnij cały test. Zmusza cię do zwracania uwagi na kretyńskie szczegóły). Użyłem go raz lub dwa razy podczas wywiadów.

W każdym razie ... zapomniałem dokładnego sformułowania, ale było to coś takiego ...

Write a function taking a single char parameter named c and returning nothing (void).
You function must satisfy the following requirements:

 - if c is bigger or equal to 0, then print 'z' to standard output
 - if c is stricly smaller than 0 , then print 'z' to standard output
 - in any other case, print the letter 'z' to standard output

Smutne jest to, że nie tylko niektórzy uczniowie wymyślą niezwykle skomplikowane rozwiązania, gdy odpowiedź jest dość oczywista, ale niektórym uda się nawet nie powieść.

I wierzcie lub nie, zdarzyło się to również podczas wywiadów.

Przeprowadzanie go w wywiadach było dość zabawne, ponieważ niektórzy kandydaci zaczęliby pisać możliwe oddziały, a następnie zdawać sobie sprawę, co jest nie tak (oczywiście, jeśli pytasz ich tylko ustnie, to całkiem zrozumiałe, że robią to podczas mówienia ... ale jeśli daj to na piśmie, to mnie zastanawia ...)

To głupie, ale wydaje mi się, że jest to minimalistyczne przesiewanie (podobnie, kiedy zatrudniam programistów JS, zawsze pytam, jak zadeklarować zmienną, a następnie w zależności od odpowiedzi, czy użycie var robi jakąkolwiek różnicę. Bardzo często smutny moment, szczerze.)


1
Czy zdarzyło Ci się kiedyś, że kandydaci w rozmowach czuli się obrażeni? A może uważasz, że po prostu dobrze się bawisz na ich koszt zamiast przeprowadzania poważnego wywiadu?
Nicole,

@Reneesis: Najpierw kilka osób patrzyło na mnie z uśmieszkiem. Niektóre z nich zakończyły się niepowodzeniem testu. Ogólnie dobrzy kandydaci śmieją się, jeśli są wyłączeni. Na przykład dla programistów JS miałem dość wielu kandydatów, którzy nie odpowiedzieli na rozmowę kwalifikacyjną „duh variablename = variablevalue;”, podczas gdy ci dobrzy śmiali się przez telefon lub osobiście i bezpośrednio mówili mi, co to za różnica lub bez var).
haylem

1
@Reneesis: Plus, nie obchodzi mnie to, że ktoś się obrazi. W żaden sposób nie jest to dyskryminujące. Jeśli się obrażą, to zakładam, że są to osoby, które nie lubią być poddawane testom ani przesłuchiwane. Nigdy tak naprawdę nie miałem kandydatów, którzy czuli, że bawię się ich kosztem. Zwykle nawet przepraszam, zanim zadam bardzo proste pytania, ponieważ może to wydawać się stratą czasu dla dobrych. Ale chodzi o to, że nie jest to dla mnie strata czasu. Na dłuższą metę ich nie pytam.
haylem

@Reneesis: I częściej nie, to, co dostałem po uśmieszku / śmiechu / obrażeniu, było zawstydzonym wyrazem twarzy i przeprosinami tego, który nie zdał egzaminu lub zaczął pisać rozgałęzienie na cały test, gdy zdali sobie sprawę, że jest to bezużyteczne. Tak, dobrze się bawię, przeprowadzając ten test, ale nie dałbym go, gdyby nie dobry powód.
haylem,

Osobiście miałbym umysłową twarz podczas czytania i zastanawiałbym się, czy ktoś inny napisał pytanie do ankietera, żeby się z niego wyśmiewał.
wildpeaks

3

To naprawdę zależy od tego, czego szukasz, ponieważ jako organizacja, która wykonuje wiele dynamicznych prac w sieci z wykorzystaniem obrazów, mam tendencję do zadawania pytań dotyczących geometrii związanych z tym zadaniem. W każdym razie zadaję pytanie dotyczące geometrii, ponieważ uważam, że jest to dobry test matematyczny, który jest ładny i wizualny i może wykazać zdolność kandydatów do wizualnego przedstawienia swojej pracy i metodycznego rozwiązania problemu.

W przypadku zaawansowanych kandydatów czasami zadaję następujące pytanie:

Ten obraz pokazuje półksiężyc. Szerokość półksiężyca od B do D wynosi 9 cm, a między E i F 5 cm. C jest środkiem większego koła.

a) Proszę obliczyć powierzchnię półksiężyca. Pytanie matematyki Półksiężyca

b) Opisz obliczenia niezbędne do zmiany rozmiaru obrazu, aby dopasować go do wewnętrznego koła z dowolnego rozmiaru i umieść go w okręgu, jeśli znany jest punkt środkowy.

Dla łatwiejszego pytania zwykle zadaję to samo pytanie, ale użyj przykładu „kwadrat w okręgu w kwadracie”. Chociaż jest to bardzo łatwe, więc oczekiwałbym na nim doskonałej algebry.

Kwadrat wewnątrz koła wewnątrz kwadratu

Poza tym staram się prosić ich o wyrzucenie algorytmu do generowania wszystkich kombinacji zestawu danych o zmiennej długości.


1
Odpowiedź na a) to 128,75? (nie wiem, czy popełniłem błąd). Podoba mi się, ale bardziej chodzi o geometrię.
Hoàng Long,

2
Przepraszamy również za opóźnienie w komentowaniu. Nie lubię głosować z reguły i podwójnie, nie komentując dlaczego. Moje zdanie nie dotyczy samego pytania, z pewnością ma dla ciebie cel, po prostu nie sądzę, aby miało odpowiedni kontekst w wywiadzie programistycznym.
Philip Regan,

7
-1, ponieważ geometria jest dobrym kandydatem do nauki Just In Time i nie odzwierciedla mojej zdolności do tworzenia wysokiej jakości oprogramowania.
Malfist,

2
Podobał mi się ten problem. Mam nadzieję, że nie masz nic przeciwko, żebym podzielił się moim rozwiązaniem części (a). Średnice różnią się o 9 cm, więc jeśli wewnętrzny okrąg ma promień r, zewnętrzny okrąg ma promień r + 4,5. Obszar półksiężyca to różnica w obszarach kół: pi (r + 4.5) ^ 2 - pi * r ^ 2. Pozostało tylko znalezienie r. Zdefiniuj C jako punkt (0,0), a następnie punkt E ma wartość (0, r - 0,5) (ponieważ CE jest o 5 cm mniejszy niż większy promień). Wewnętrzne koło jest przesunięte w prawo o 4,5 cm, więc jego równanie to (x - 4,5) ^ 2 + y ^ 2 = r ^ 2. Podłącz (x, y) = (0, r - 0,5) i rozwiąż dla r.
Tim Goodman

2
+1, ponieważ uważam, że to dobre pytanie w przypadku zadania wymagającego geometrii. W grę wchodzi wiele argumentów, nie tylko podłączenie do formuły. To powiedziawszy, znam kilku dobrych programistów, którzy wpadliby w potrzask tylko dlatego, że za 10 lat nie musieli myśleć o kręgach - ale pytanie to nie wymaga odpowiedniego pytania do jakiegokolwiek wywiadu dla programistów. Obecnie najczęściej głosowane pytanie SQL (które również mi się podoba) dotyczy przynajmniej zadania.
Tim Goodman

3

Najlepsze odpowiedzi FizzBuzz , jakie widziałem, to:

SQL Server 2008

;WITH mil AS (
 SELECT TOP 100 ROW_NUMBER() OVER ( ORDER BY c.column_id ) [n]
 FROM master.sys.all_columns as c
 CROSS JOIN master.sys.all_columns as c2
)                
 SELECT CASE WHEN n  % 3 = 0 THEN
             CASE WHEN n  % 5 = 0 THEN 'FizzBuzz' ELSE 'Fizz' END
        WHEN n % 5 = 0 THEN 'Buzz'
        ELSE CAST(n AS char(6))
     END + CHAR(13)
 FROM mil

C # (prosty)

foreach (int number in Enumerable.Range(1, 100))
{
    bool isDivisibleBy3 = (number % 3) == 0;
    bool isDivisibleBy5 = (number % 5) == 0;

    if (isDivisibleBy3)
         Console.Write("Fizz");

    if (isDivisibleBy5)
         Console.Write("Buzz");

    if (!isDivisibleBy3 && !isDivisibleBy5)
         Console.Write(number);

    Console.WriteLine();
}

C # (sprytny)

 Enumerable
  .Range(1, 100)
  .Select(i =>
    i % 15 == 0 ? "FizzBuzz" :
    i % 5 == 0 ? "Buzz" :
    i % 3 == 0 ? "Fizz" :
    i.ToString())
  .ToList()
  .ForEach(s => Console.WriteLine(s));

1
Możesz dodać, w którym konkretnym dialekcie SQL jest napisane.

Ładnie wygląda z funkcjonalnym stylem.
Orbling

2

Poszukuję kilku rzeczy u kandydatów, z którymi rozmawiałem. Z powodu, którego nie potrafię opisać online, mamy dość biednych kandydatów i zacząłem się tego spodziewać, więc jestem na nich dość swobodny. Mimo to szukam:

  • Świadomość projektowania.

    „Pokaż mi strukturę tabeli dla programu książki adresowej, który zawiera Kontakty z imionami i nazwiskami, które mogą mieć wiele numerów telefonów z opisem numeru (komórka / dom / praca / itp.)”

    Nie szukam tutaj diagramu specyfikacji UML 2.0, prosty diagram bąbelkowy jest w porządku. O ile jest to uzasadnione.

  • Znajomość pracy z bazą danych (np. SQL)

    1. Napisz zapytanie, aby uzyskać wszystkie numery telefonów dla osób o nazwisku „Smith”
    2. Napisz zapytanie, aby uzyskać wszystkich klientów w bazie danych oraz numery telefonów dla osób o nazwisku „Smith”
  • Znajomość testowania

    Załóżmy, że istnieje metoda z podpisem public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName), która zwraca wyniki wcześniejszego zapytania. Załóżmy, że przekazanie wartości NULL do metody powoduje zgłoszenie wyjątku NullReferenceException. Napisz test, aby zademonstrować tę funkcjonalność.

    Napisz test, który wykaże, że GetPhoneNumbers zwróci domowy numer telefonu (123) 456-7890 dla osoby o nazwisku „Smith”.

  • Znajomość pisania kodu

    Zaimplementuj metodę, która spełni wymagania napisanych testów.


Biorąc pod uwagę liczbę i jakość kandydatów, których otrzymaliśmy, przeprowadziłem wywiady ze wszystkimi, którzy kiedykolwiek poważnie się zgłosili. Nie zatrudniłem nikogo.


Czy w SQL # 2 mówisz o zrobieniu tego wszystkiego w jednym zapytaniu? Czy celem jest jedynie ocena zrozumienia złączeń lewy / prawy lub wewnętrzny?
Nicole,

@Reneesis: Tak jest.
Steven Evers,

2

Zazwyczaj pozwalam im naszkicować schemat blokowy ostatniego systemu, nad którym pracowali, pytając o relacje między blokami, a następnie pozwalam im na opracowanie bloku, nad którym pracowali / kierowali. Możesz nauczyć się wielu z tego ćwiczenia, na przykład, jak wygląda się poza jego małą domeną, jak bardzo ważne jest, aby wiedzieć, „gdzie” on gra, a także możesz dowiedzieć się o roli, którą grał, czy był to klucz czy strona rola.


2

Napisz algorytm dla następującego problemu: Biorąc pod uwagę liczbę n , wypisz całkowitą liczbę (unikalnych) drzew binarnych, które mają n węzłów.

Zatem dla n = 0 i n = 1 odpowiedź wynosi 1. Dla n = 2 masz 2: węzeł główny, a następnie drugi węzeł po lewej lub prawej stronie.

Możesz uzyskać wgląd w techniki projektowania i sprawdzić, czy myślą o rekurencji, zapamiętywaniu czy rozwiązaniu do programowania dynamicznego.

[Zobacz także tę dyskusję StackOverflow dotyczącą pokrewnych, ale różnych przypadków drzew wyszukiwania binarnego.]


Więc programista interfejsu użytkownika, który nie zna programowania dynamicznego, jest złym programistą? Szczerze mówiąc, każdy programista biznesowy, który nie pamięta programowania dynamicznego, jest zły? Wielu nastolatków w topcoder przejdzie przez problem z dynamicznym programowaniem, ale proszę spojrzeć na kod, który piszą.
Geek

@Geek: Pamiętaj, że problemy z „tablicą” są sposobem na obserwowanie czyichś procesów myślowych. W tej dyskusji powinny pojawić się problemy z dynamicznym programowaniem, ponieważ są one bardzo popularne między innymi w Google.
Macneil

Nie zgadzam się, ale mam dwa pytania. 1. Rozwiązywanie nieznanego? Problemy z DP stają się walką w parku, jeśli rozwiązałeś jakieś problemy w niedawnej przeszłości lub nadal pamiętasz koncepcję po studiach. Ktoś, kto o tym zapomniał, na pewno nie będzie dobrze na białej tablicy. 2. Jeśli ktoś stara się rozwiązać problem, nie ma sposobu, aby oszacować jakość jego kodu. Co powiesz na problem z czymś takim jak LinkList lub Ciągi lub Tablice, aby osoba mogła rozwiązać problem i napisać kod.
Geek

Jednak niekoniecznie spodziewałbym się, że rozmówca zrobi to dobrze, jednak niektóre firmy tak zrobią.
Macneil

@Geek: „… programista, który nie zna programowania dynamicznego, jest złym programistą?” - tak . To powiedziawszy, zgadzam się, że myślenie w programowaniu dynamicznym nie jest trywialne, jeśli nie jesteś do tego przyzwyczajony. Ale wiedząc, że to absolutna konieczność.
Konrad Rudolph,

2

Gdybym miał przeprowadzić wywiad z programistą, poprosiłbym go o zaprojektowanie oprogramowania i opisanie wymagań sprzętowych w celu usunięcia zduplikowanych wpisów z dowolnie dużego pliku zawierającego pełną nazwę w każdym wierszu. Celowo zostawiam niektóre części opisu problemu niejednoznacznie. Następnie wzywam go do sprawdzenia, czy rozumie analizowanie i wyjaśnianie wymagań, różne kompromisy, struktury danych i algorytmy, operacje we / wy (pamięć dodatkowa), technologie oprogramowania i sprzętu, skalowalność itp.

Myślę, że jest to mały, ale wymagający problem, ujawniający wiedzę i umiejętności kandydata w wielu obszarach komputerowych.


2

Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence

Wielu facetów mogło utknąć w tym. Jeśli podano jakieś rozwiązanie - zwykle używa rekurencji. Po tym:

Implement the same via 'for'-loop

Nie mogę powiedzieć, ilu stypendystom nie udało się wykonać obu zadań - 50% kandydatów.
Dlatego to lubię :)


Co się stanie, jeśli pierwsza implementacja zostanie wykonana za pośrednictwem pętli for?
Darknight

2
Proponowana jest wersja rekurencyjna. Zwykle po tym, jak faceci z pętli for z powodzeniem wdrażają wersję rekurencyjną.
alexb

Czy można zaimplementować to jako pojedynczej instrukcji: fib(n)=round(power(PHI,n)/SQRT5). PHI i SQRT5 są stałymi reprezentującymi odpowiednio złoty współczynnik (1,618 ...) i pierwiastek kwadratowy z 5.
oosterwal

2

W przypadku baz danych korzystam z:

Tabela: Rzeczy

Nazwa ID
1 Bodkin Van Horn
2 Hoos-Foos
3 Hoos-Foos
4 Hot-Shot
5 Marvin O'Gravel Balonowa twarz
6 Snimm
7 Marvin O'Gravel Balonowa twarz
8 Marvin O'Gravel Balonowa twarz
9 Dave

Napisz mi trochę kodu SQL, który zduplikuje tabelę taką jak ta na podstawie nazwy (i nie dbam o to, który identyfikator otrzymam, ale którykolwiek zwrócony musi być prawidłowy dla tej nazwy). Tak więc tabela po zastosowaniu do niej poprawnego SQL będzie prezentować coś takiego:

Tabela: Rzeczy

Nazwa ID
1 Bodkin Van Horn
2 Hoos-Foos
4 Hot-Shot
5 Marvin O'Gravel Balonowa twarz
6 Snimm
9 Dave

Lubię to ponieważ:

  • Dublowanie jest problemem w świecie rzeczywistym
  • Istnieje wiele sposobów, aby to zrobić
  • Myślę, że prawie wszystkie z tych sposobów wymagają albo zrozumienia (nieco) bardziej złożonego SQL (zasadniczo GROUP BY i HAVING), albo umiejętności rozumowania poprzez łączenie wielu prostszych instrukcji.
  • Z tego powodu, nawet jeśli mają problemy ze składnią lub czymkolwiek innym, możesz zapytać ich, co myślą i tak to omówić.
  • Odwołuje się do doktora Seussa

(W tym miejscu stwierdzam, że istnieje jakiś całkowicie trywialny sposób na zrobienie tego i przez zbyt wiele lat komplikowałem to).


1
Chyba nie wiem, co liczy się jako „całkowicie trywialne” ... Coś w SELECT min(ID), Name FROM Things GROUP BY Nametym zadziałałoby, prawda?
Tim Goodman,

@Tim - daje ci liczenie na wszystko. Chcę tylko tych z duplikatami. Ręcznie edytowane wyniki się nie liczą, załóżmy, że są skalowane do milionów wierszy. Jest to łatwy problem, ale z mojego doświadczenia wynika, że ​​80% osób twierdzących, że zna SQL, nie może sięgnąć nawet pierwszego ciosu.
Jon Hopkins,

@Jon: Nie jestem pewien, co rozumiesz przez „To daje liczenie na wszystko”. Z twojego przykładowego rozwiązania wygląda na to, że chcesz mieć jeden wiersz dla każdej odrębnej nazwy. Z twoich komentarzy wydaje się, że może masz na myśli coś takiego HAVING count(Name) > 1, ale sądzę, że twoja przykładowa odpowiedź powinna pomijać Bodkin Van Horn, Hot Shot, Snimm i Dave.
Tim Goodman,

@Tim - Masz rację, to jest naprawdę niejasne. Będę edytować, gdy otrzymam kilka minut.
Jon Hopkins,

1
Chyba bym to zrobić: DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name). Czy masz preferowane rozwiązanie?
Tim Goodman,

2

Moim ulubionym problemem tablicy C ++ jest implementacja kandydata

Vector3 a(1, 0, 0), b(0, 1, 0); // Mathematical 3D vectors
double c = 7.0;
double d = a * c;
Vector3 e = a * b;

Z tego mogę się nauczyć

  • jeśli kandydat uzna, że ​​nie można przeciążać typu zwrotu (wskazanie poziomu C ++ juniourour)
  • jeśli kandydat wie, jak zwrócić tymczasowe i zaimplementować operatory rzutowania (wskazanie poziomu pośredniego C ++)
  • jeśli kandydat potrafi wykonać podstawową matematykę wektorową (ważne dla naszej domeny aplikacji)

2

Jak reprezentowałbyś standardową talię 52 kart? Każdy język programowania jest w porządku. Jak potasowałbyś karty?


wektor <Karta> z funkcją losowego C ++ :)
prawej

1

Moim ulubionym jest zacząć od pytania o prototyp printf. Następnie biorąc pod uwagę niskopoziomowy interfejs API printc (char c), który wypisze jeden znak, zaimplementuj printf. Daje różnego rodzaju interesujące odpowiedzi, takie jak stos jest częścią procesora. Jak mogłeś się domyślić, jestem z C i osadzonego tła.


Nie rozumiem, że „stos jest częścią procesora”.
barjak

Każdy, kto wie coś o architekturze komputerowej, będzie o tym wiedział. Dla mnie jest to całkowicie niezwiązane, więc facet demonstruje swoją ignorancję.
Michael K

@aufather: Jeśli dobrze pamiętam, musisz zadzwonić varargs()lub coś takiego. Mam rację? Zrobiłem to tylko raz, żeby powiedzieć, że zrobiłem to jakiś czas temu.
Michael K

@barjak - Kiedy zaczniesz implementować printf, będziesz musiał uzyskać dostęp do swojego stosu, a ja otrzymałem odpowiedzi, że stos znajduje się w procesorze.
sierpień

@Michael - W świecie osadzonym musisz naprawdę dobrze znać swoją architekturę platformy. To pytanie szybko eliminuje ignorantów dość wcześnie.
sierpień

1

Masz miskę z 200 rybami. Z tych ryb 99% nie jest gupikami. Ile ryb należy usunąć, aby 2% pozostałych to gupiki. Pokaż swoją pracę.

Chodzi o mylące wymagania. Mówi się w ten sposób, że wielokrotnie zmienia się perspektywę podczas tego samego pytania. Ma to na celu sprawdzenie, czy mogą dowiedzieć się, co się naprawdę dzieje.

Byłbyś zaskoczony, ilu ludzi się myli.


4
Dodaj dwa 12-calowe Oscary do miski, które wkrótce usuną 98% gupików.
Geek

Co się stanie, jeśli usuniesz gupika?

1
1% gupików, = 200 x 1% = 2 (200-2 = 198 innych ryb), gdzie 2 = 2%, pozostałe ryby = 98% = 98 (1: 1). 98 = 198–100 => answer = 100. [Zakładając, że możesz selektywnie zbierać inne ryby. Jeśli usuwamy gupiki, są inne odpowiedzi.] Dobre pytanie, zdziwiłbyś się, jak niewiele osób radzi sobie z tym dobrze, chociaż dla programisty powinna to być dziecinnie prosta zabawa.
Orbling

1

Mam kilka ulubionych, ale oto kilka, które prawie zawsze pojawiają się. Przez większość czasu robię końcowe rundy wywiadów technicznych (C ++), więc faworyzuję dłuższe i bardziej otwarte pytania, które prowadzą do nowych obszarów zainteresowania. Nie ma „właściwej” odpowiedzi, tylko otwarcie na inną rozmowę.

1) Wdrożenie podstawowego wspólnego wskaźnika, wyjaśnienia, w których miejscach występują braki w porównaniu do wspólnych wskaźników tr1 lub boost w ich implementacji, jak należy go używać itp.

2) Przegląd kodu. W przypadku doświadczonych pracowników oczekujemy, że będą oni w stanie śmiało przejrzeć część dostarczonego kodu pod kątem problemów projektowych, błędów, problemów z kodowaniem i potencjalnych problemów z utrzymaniem. Oczywiście, jak to naprawią; a czasem jak przekazali tę wiadomość młodszemu programistowi, którego zestrzelili.


1

Jedno pytanie, z którego korzystam, odkąd zostało ono użyte na mnie, jest następujące:

Napisz funkcję, aby wydrukować wszystkie liczby od 1 do 100.

Duża część powodu, dla którego go używałem, wynika z faktu, że możesz tam wziąć rozwiązanie i poruszać się w różnych kierunkach:

Jak zmodyfikowałbyś funkcję, aby drukować wszystkie liczby od 1 do 1000, 10000 lub n ?

Ich odpowiedzi na te pytania mogą dać ci wgląd w to, jak reagują na zmieniające się wymagania, a także czy potrafią rozpoznać względy wydajności. Silny kandydat może odpowiedzieć pytaniem dotyczącym tego, jaka funkcja jest potrzebna do tego, jak często byłaby wywoływana.

Poruszanie się w innym kierunku:

Jak zmieniłbyś sytuację, gdybyś wiedział, że ta funkcja będzie wywoływana kilka razy na minutę, a wydajność jest problemem?

Używam tego jako sposobu na sprawdzenie ich myślenia bocznego. Ponieważ obliczanie liczb pierwszych może być powolne, ponieważ maksymalna wartość staje się większa, czasem bardziej sensowne jest po prostu użycie pewnego rodzaju obliczonej lub wstępnie obliczonej tabeli przeglądowej, która jest dostosowywana na podstawie problemu, który próbujesz rozwiązać.


1

Oto jeden, aby sprowokować do myślenia - to proste, wymaga odrobiny matematyki i sprawdza wiedzę kandydata w zakresie podstawowego projektowania komputerów (przepełnienie, reprezentacja numeryczna itp.):

Napisz program (lub procedurę), który pobiera na wejściu parę liczb całkowitych X, Y i określa, czy X * Y jest równomiernie podzielny przez 10. WAŻNA UWAGA: X i Y mogą być na tyle duże, że X * Y przepełnia największy dostępny typ liczb całkowitych na twojej maszynie.


Przykładowe rozwiązanie:


T_BOOL MultipleOfTen(int x, int y)
{
    return((x%2==0 || y%2==0) && (x%5==0 || y%5==0));
}

0

Wypełnij następującą metodę: PS Tryb liczby to liczba (na liście), która ma najwięcej wystąpień.

public int getMode(List<Integer> numberList) {


}

To sprawdzi, czy efektywny jest twój kod.


-2

Jak przedstawilibyście macierz zapasową, która jest stosunkowo duża ... powiedzmy 1000x1000, ale ma najwyżej 100 niezerowych wpisów?

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.