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.
interview
algorithms
NickC
źródło
źródło
Odpowiedzi:
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.
źródło
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.
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.
źródło
„Narysuj mi na tablicy projekt ostatniego projektu, nad którym pracowałeś, nie ujawniając mi żadnych wrażliwych szczegółów.”
źródło
Wdrożyć
strcpy
,strcmp
i przyjaciół.źródło
atoi()
.strdup()
.strrev()
lub odwrócenie ciągu znaków. Moje rozwiązanie białej tablicy zrobiło na nich wrażenie i teraz wykonuję pracę.Moim ulubionym, który obejmuje kilka dyscyplin, jest policzenie liczby węzłów w drzewie binarnym, biorąc pod uwagę interfejs (w C #):
i dla zabawy, oto implementacja, choć rozmówca nie musi tego widzieć.
i klasa asystenta:
Rozwiązanie, które lubię, to:
Jak pokazuje znajomość:
źródło
Są dwa pytania, które wywołały dla mnie interesujące dyskusje na tablicy
Zaczynają od prostych, a następnie stają się coraz bardziej złożone.
źródło
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.)
źródło
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.
źródło
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.
źródło
Moim ulubionym był mój przyjaciel.
Działa dobrze, ponieważ:
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.
Jest niezależny od języka.
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ą.
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.
źródło
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 ...
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.)
źródło
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 bezvar
).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:
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.
Poza tym staram się prosić ich o wyrzucenie algorytmu do generowania wszystkich kombinacji zestawu danych o zmiennej długości.
źródło
Najlepsze odpowiedzi FizzBuzz , jakie widziałem, to:
SQL Server 2008
C # (prosty)
C # (sprytny)
źródło
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)
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.
źródło
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.
źródło
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.]
źródło
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.
źródło
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ę :)
źródło
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.W przypadku baz danych korzystam z:
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:
Lubię to ponieważ:
(W tym miejscu stwierdzam, że istnieje jakiś całkowicie trywialny sposób na zrobienie tego i przez zbyt wiele lat komplikowałem to).
źródło
SELECT min(ID), Name FROM Things GROUP BY Name
tym zadziałałoby, prawda?HAVING count(Name) > 1
, ale sądzę, że twoja przykładowa odpowiedź powinna pomijać Bodkin Van Horn, Hot Shot, Snimm i Dave.DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name)
. Czy masz preferowane rozwiązanie?Moim ulubionym problemem tablicy C ++ jest implementacja kandydata
Z tego mogę się nauczyć
źródło
Jak reprezentowałbyś standardową talię 52 kart? Każdy język programowania jest w porządku. Jak potasowałbyś karty?
źródło
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.
źródło
varargs()
lub coś takiego. Mam rację? Zrobiłem to tylko raz, żeby powiedzieć, że zrobiłem to jakiś czas temu.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.
źródło
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.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.
źródło
Jedno pytanie, z którego korzystam, odkąd zostało ono użyte na mnie, jest następujące:
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:
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:
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ć.
źródło
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:
źródło
Wypełnij następującą metodę: PS Tryb liczby to liczba (na liście), która ma najwięcej wystąpień.
To sprawdzi, czy efektywny jest twój kod.
źródło
Jak przedstawilibyście macierz zapasową, która jest stosunkowo duża ... powiedzmy 1000x1000, ale ma najwyżej 100 niezerowych wpisów?
źródło