Alternatywne pytania FizzBuzz [zamknięte]


88

Ktoś ma jakieś pytania typu dobry FizzBuzz które nie są problemem FizzBuzz?

Przeprowadzam z kimś wywiad, a FB jest stosunkowo dobrze znany i nie jest trudny do zapamiętania, więc moim pierwszym przystankiem w poszukiwaniu pomysłów jest moje nowe uzależnienie.

Odpowiedzi:


104

Widziałem małą listę stosunkowo prostych problemów programistycznych używanych do usuwania kandydatów, podobnie jak FizzBuzz. Oto kilka problemów, które widziałem, w kolejności rosnącej trudności:

  1. Odwróć ciąg
  2. Odwróć zdanie („Bob lubi psy” -> „Psy lubi Bob”)
  3. Znajdź minimalną wartość na liście
  4. Znajdź maksymalną wartość na liście
  5. Oblicz resztę (biorąc pod uwagę licznik i mianownik)
  6. Zwróć odrębne wartości z listy, w tym duplikatów (np. „1 3 5 3 7 3 1 1 5” -> „1 3 5 7”)
  7. Zwróć odrębne wartości i ich liczby (tj. Na powyższej liście pojawi się „1 (3) 3 (3) 5 (2) 7 (1)”)
  8. Biorąc pod uwagę ciąg wyrażeń (tylko zmienne, + i -) oraz zestaw par zmienna / wartość (tj. A = 1, b = 7, c = 3, d = 14) zwraca wynik wyrażenia ("a + b + c -d "będzie równe -3).

Były one przeznaczone dla Javy i można było korzystać ze standardowych bibliotek, więc niektóre z nich mogą być niezwykle łatwe (np. 6). Ale działają jak FizzBuzz. Jeśli masz pojęcie o programowaniu, powinieneś być w stanie to zrobić najszybciej. Nawet jeśli nie znasz dobrze języka, powinieneś przynajmniej być w stanie dać pomysł, jak coś zrobić.

Korzystając z tego testu, jeden z moich poprzednich szefów widział wszystko, od ludzi, którzy przeszli wszystko dość szybko, po ludzi, którzy potrafili zrobić to bardzo szybko, po jednego faceta, który nie potrafił odpowiedzieć na ani jednego po pół godzinie.

Powinienem również zauważyć: pozwalał ludziom korzystać ze swojego komputera, gdy otrzymywali te zadania. Zostali specjalnie poinstruowani, że mogą korzystać z Google i tym podobnych.


Czy w przypadku punktu 8 zostanie zaakceptowane rozwiązanie oparte na JSR-223 (javax.script)? :-P (Wprawdzie użycie tego jest kompletną przesadą, ale niektórzy woleliby to zrobić niż, powiedzmy, java.util.Scanner.)
Chris Jester-Young

4
Nie mieści się to w moim wyobrażeniu o duchu pytania, ale jeśli wiesz wystarczająco dużo, aby to zaproponować, to z pewnością wiesz wystarczająco dużo, aby odpowiedzieć na pytania FizzBuzz, więc nie mam tego za złe. Może to być nawet plus na Twoją korzyść. Nadal jednak zapytałbym, jak byś to zrobił bez javax.script.
MBCook

3
Czytałem twoją odpowiedź przez jakiś czas i nie mogłem dowiedzieć się, co się dzieje, dlaczego mi się to nie podobało, chodzi o to, że twoje pytania nie są zabawne w kodowaniu :) (co jest w porządku, ponieważ było to zamierzone do wywiadów). Ten komentarz nie ma sensu, ale chciałem go tylko usunąć z mojego systemu. :) przepraszam za wszystkie buźki
Trufa

1
Chciałbym zobaczyć przykładowe rozwiązania dla numeru 8. Pierwsze 7 to pestka, ale 8 (dla mnie) wydaje się nieco bardziej skomplikowane w porównaniu z resztą. Pracuję nad tym w Pythonie 3.xi to zupełnie inna gra. Prawdopodobnie coś, czego nie jestem świadomy.
DonutSteve

31

Być może nie odpowiada to bezpośrednio na twoje pytanie, ale nie jestem pewien, czy musisz wymyślić inny problem. Poza tym, że jest „łatwe do zapamiętania”, pytanie FizzBuzz jest po prostu „łatwe” i o to chodzi. Jeśli osoba, z którą rozmawiasz, należy do klasy ludzi, dla których FizzBuzz jest „dobrze znany”, to jest to klasa osób, których nie odfiltrowałoby pytanie typu FizzBuzz. Nie oznacza to, że zatrudniasz ich na miejscu, ale oznacza, że ​​powinni być w stanie przedrzeć się przez to i przejść do sedna wywiadu.

Innymi słowy, każdy, kto poświęci czas na przeczytanie Coding Horror, jest wart dalszej rozmowy. Po prostu poproś ich, aby bardzo szybko napisali rozwiązanie, krótko je omówili (np. Jak to przetestować?), A następnie przejdź do następnego pytania. Jak czytamy w artykule, „to naprawdę zdumiewające, jak wielu kandydatów nie potrafi wykonać najprostszych zadań programistycznych”.


7
Świetna odpowiedź. „FizzBuzz jest łatwy i właśnie o to chodzi… każdy, kto poświęci czas na przeczytanie Coding Horror, jest wart dalszej rozmowy” QFT. Często pytam kandydatów, „gdzie czytasz o programowaniu?” Zawsze jestem zaskoczony, jak wiele osób nie jest w stanie wymienić ani jednego bloga, strony internetowej czy książki.
Noah Sussman,

1
Nie zgadzam się. Przeprowadziliśmy z kimś wywiad w zeszłym tygodniu i zapytaliśmy go nr 3 z zaakceptowanej odpowiedzi. Dosłownie powiedzieli „och, spodziewałem się szumu” i nie byli w stanie odpowiedzieć na nasze pytanie.
frandroid

23

Każdy z wczesnych z Projektu Euler byłby prawdopodobnie dobry.

Na przykład:

Zadanie 25

Ciąg Fibonacciego jest określony przez relację rekurencji:

Fn = Fn−1 + Fn−2, where F1 = 1 and F2 = 1.

Stąd pierwszych 12 terminów będzie:

F1 = 1
F2 = 1
F3 = 2
F4 = 3
F5 = 5
F6 = 8
F7 = 13
F8 = 21
F9 = 34
F10 = 55
F11 = 89
F12 = 144

Dwunasty człon, F12, jest pierwszym terminem zawierającym trzy cyfry.

Jaki jest indeks pierwszego wyrazu w ciągu Fibonacciego, który ma zawierać 1000 cyfr?


14

Odkryłem, że sprawdzanie sznurka, czy jest to palindrom, jest dość proste i może być porządnym chwastownikiem.


Powiedziałbym, że to zależy od języka. W C mogłoby to być interesujące, w Perlu już to zrobione scalar(reverse 'foo') == 'foo'.
jkramer

3
to prawda, ale jednocześnie możliwość zobaczenia prostszego rozwiązania jest cenna ... wtedy mówisz „ok, teraz udawaj, że nie masz funkcji odwrotnej”.
Mike Stone

1
W C ++ dałbym dodatkowe punkty za każde „funkcjonalne” rozwiązanie, które nie zawiera odręcznej pętli. np. „return equal (str.begin (), str.end (), str.rbegin ());” lub (dla maniaków szybkości) "return equal (str.begin (), str.begin () + str.size () / 2, str.rbegin ());"
Chris Jester-Young

1
Oczywiście widząc taką odpowiedź poprosiłbym również kandydata o wyjaśnienie działania kodu. Nie mogą się podnieść, po prostu kopiując moją odpowiedź powyżej! :-P
Chris Jester-Young

10

Chciałem pytanie FizzBuzz, które nie obejmuje operatora modulo. Zwłaszcza, że ​​zazwyczaj przeprowadzam wywiady z twórcami stron internetowych, dla których operator modulo nie pojawia się tak często. A jeśli nie jest to coś, na co napotykasz regularnie, jest to jedna z tych rzeczy, które sprawdzasz kilka razy, gdy jej potrzebujesz.

(Oczywiście, jest to koncepcja, którą najlepiej byłoby spotkać na jakimś kursie matematyki gdzieś po drodze, ale to inny temat.)

Tak więc wymyśliłem to, co bez wyobraźni nazywam Trójką w odwrotnej kolejności . Instrukcja jest następująca:

Napisz program, który wypisze w odwrotnej kolejności każdą wielokrotność 3 z przedziału od 1 do 200.

Robiąc to w normalnej kolejności, to łatwe: pomnóż indeks pętli przez 3, aż osiągniesz liczbę przekraczającą 200, a następnie zakończ. Nie musisz się martwić o to, po ilu iteracjach zakończyć, po prostu kontynuujesz, aż osiągniesz pierwszą zbyt wysoką wartość.

Ale cofając się, musisz wiedzieć, od czego zacząć. Niektórzy mogą intuicyjnie zdawać sobie sprawę, że 198 (3 * 66) to najwyższa wielokrotność 3 i jako taka, zakoduje na stałe 66 w pętli. Inni mogą użyć operacji matematycznej (dzielenie liczb całkowitych lub floor () na dzieleniu zmiennoprzecinkowym 200 i 3), aby obliczyć tę liczbę, a robiąc to, zapewnić coś bardziej ogólnego zastosowania.

Zasadniczo jest to ten sam rodzaj problemu, co FizzBuzz (zapętlanie wartości i drukowanie ich z niespodzianką). Jest to problem do rozwiązania, który nie wykorzystuje niczego tak (względnie) ezoterycznego jak operacja modulo.


2
Jestem ciekawy Legion: w jaki sposób twoi programiści WWW robią takie rzeczy, jak zielone paski / naprzemienne wiersze bez modulo?
Andrew Burns

4
Cóż, jeśli próbujesz tylko zastosować style do naprzemiennych wierszy, używając selektora nth-child w CSS3. jQuery ma również alternatywne selektory do robienia takich rzeczy za pomocą JS. Ale mówiąc o większym punkcie, jak powiedziałem powyżej, jest to coś, co jest sprawdzane, używane, a następnie szybko zapomniane, ponieważ znalezienie zajęło całe 15 sekund. Nie mówię, że mi się to podoba lub akceptuję, ale zdarza się to zwłaszcza na poziomie podstawowym. :)
Legion

1
oto moje rozwiązanie php :) ideone.com/BnJQ3 3 minuty :)
Trufa

To musi być trudniejsze w językach niższego poziomu, ponieważ w Rubim jest to tak proste, jak wpychanie liczb (w kolejności) do tablicy, a następnie odwracanie całej tablicy. ideone.com/MKKb6
Kerrick

Python:print [x for x in xrange(3, 200, 3)][::-1]
beatgammit

9

Aby uzyskać coś naprawdę super prostego, które można zrobić w 10 sekund, ale usunęłoby ludzi, którzy dosłownie nie mogą niczego zaprogramować , wypróbuj ten:

Zapytaj: pokaż mi (na papierze, ale lepiej na tablicy), jak zamienić wartości dwóch zmiennych.

To nie był mój pomysł, ale został opublikowany w komentarzu przez kogoś o imieniu Jacob w poście na blogu dotyczącym oryginalnego pytania FizzBuzz.

Jakub mówi dalej:

Jeśli nie zaczną od utworzenia trzeciej zmiennej, możesz ją odpisać. Przekonałem się, że mogę zmniejszyć liczbę kandydatów o jedną trzecią do połowy (wprawdzie w tym momencie nie poddanych kontroli), którzy mają tylko to pytanie.

Po tym komentarzu do oryginalnego wpisu na blogu jest kolejna interesująca dyskusja na temat sposobów wykonywania tej zamiany zmiennych bez konieczności stosowania trzeciej zmiennej (dodawanie / odejmowanie, xor itp.) I oczywiście, jeśli używasz języka, który to obsługuje w pojedynczej instrukcji / operacji może to nie być taki dobry test.

Chociaż nie jest to mój pomysł, chciałem zamieścić to tutaj, ponieważ jest to tak elegancko proste, łatwe pytanie, na które ktoś, kto napisał nawet najprostszy program, może (i powinien) odpowiedzieć w ciągu około 10 sekund. Nie wymaga też użycia pozornie mało znanych operatorów, takich jak operator modulo, których wielu ludzi, którzy poza tym są całkiem przyzwoitymi programistami, po prostu nie zna (co wiem z własnego doświadczenia).


1
Myślę, że to bardzo dobry pomysł. Z pewnością przebija siedzenie przez 20 minut i oglądanie, podczas gdy kandydat boleśnie debuguje program, zastanawiając się, dlaczego użył foreach zamiast for i jak to naprawić! (Tak jak właśnie zrobiłem)
mike nelson

std :: swap (a, b); Dlaczego miałbym tworzyć trzecią zmienną, skoro prawie każda standardowa biblioteka z przyjemnością zrobi to za mnie?

@Dan - Chodzi o to, że jesteś proszony o zrobienie tego bez korzystania z żadnych bibliotek i używając tylko wbudowanych słów kluczowych w wybranym języku. Jasne, w prawdziwym świecie możesz użyć procedury bibliotecznej, aby to osiągnąć, tak samo jak użycie procedury bibliotecznej dla (powiedzmy) struktury listy połączonej, zamiast pisania własnej. Celem tego testu jest to, że jest wystarczająco prosty i nie wyklucza oczekiwać, że każdy kandydat będzie w stanie to zrobić bez konieczności uciekania się do biblioteki, aby to zrobić.
CraigTP

Czy więc Jacob sugeruje rozmówcy użycie trzeciej zmiennej, czy też nie? Widziałem alternatywy dla tego pytania, w których prosiło programistę, aby nie używał trzeciej zmiennej. Sposób, w jaki sformułował swoją odpowiedź, jest dość niejednoznaczny.
theGreenCabbage

1
Jako ktoś, kto myśli, że jest po prostu „w porządku” programistą, wystraszyło mnie to. Od razu pomyślałem: „Drogi Boże, użyłbym trzeciej zmiennej, ale na pewno chce jakiegoś sprytnego sposobu na zrobienie tego bez niej!”
Devil's Advocate

8

Fibonacci, odwróć łańcuch, zlicz liczbę bitów ustawionych w bajcie to inne popularne. Projekt Euler ma również dużą kolekcję o rosnącym stopniu trudności.


Fibonaaci, choć trochę bardziej zaawansowany, jest fajny, jestem kompletnym nowicjuszem i zajęło mi to 20-25 minut, więc tam jest twoja referencja :)
Trufa

Uderzył mnie Fibonacci, FizzBuzz i usunąłem zduplikowane liczby całkowite w tablicy - wszystko to dzisiaj w wywiadzie (4 godziny)
IAbstract.

4

Poproś ich o napisanie aplikacji, która będzie zwracać czynniki z podanej liczby. Jest to łatwe do zrobienia i trudne do osiągnięcia w krótkim czasie. Możesz zobaczyć ich styl i sposób, w jaki rozważają problemy w krótkim czasie.


2

Zwraca indeks pierwszego wystąpienia ciągu X w ciągu Y

Implementacja strstr () wymaga podstawowej znajomości języka, zapewniając jednocześnie możliwość sprytnej optymalizacji.


2

Jeśli jest to rozmowa kwalifikacyjna w C / C ++, upewnij się, że osoba wie o wskazówkach.

Ogólne - prosty algorytm (lista [pojedyncza / podwójna] połączona). Zapytaj o złożoność dodawania w każdym przypadku (na początku, na końcu, optymalizacje ...)?

(Ogólne) Jak znaleźć wartości minimalne i maksymalne z tablicy (rozmiar N) z zaledwie 3 * N / 2 porównaniami?

C / C ++: Jak zoptymalizowałbyś wiele "strcat" do bufora?


Wydaje mi się, że w przypadku problemu „Jak znaleźć min i maksimum z tablicy (rozmiar N) przy zaledwie 3 * N / 2 porównaniach?” dobrze jest wyjaśnić, że liczba 3 * N / 2 to liczba porównań elementów tablicy, ale można np. swobodnie porównać int. np. (i <rozmiar tablicy) w pętlach.
sergtk


0

Co powiesz na: chcę używać jednej liczby całkowitej do przechowywania wielu wartości. Opisz, jak to zadziała.

Jeśli nie mają pojęcia o maskach bitowych i operacjach, prawdopodobnie nie mogą rozwiązać innych problemów.


9
Powiedziałbym, że bardziej pouczające byłoby, gdyby po wyjaśnieniu lub wskazaniu maski ugryzienia osoba nie uderzyła się w czoło i nie potrząsnęła głową w kpinie z samego siebie. Maski bitowe nie są powszechnym idiomem, chyba że używa się języka C, urządzeń wbudowanych lub sieci. Wielu utalentowanych ludzi tego nie robi.
Gregg Lind

2
Hmm, wtedy musisz zdecydować, czy zaakceptowanie zapisywania 1,2 i 3 w dziesiętnym 123 liczy się jako poprawna odpowiedź, nawet jeśli matematyka byłaby brzydko skomplikowana w porównaniu do zadeklarowania tylko 3 zmiennych. Lub zapisując 1, 2, 3 pisząc x = 1; x = 2; x = 3; Chodzi mi o to, czy musimy przechowywać te wartości jednocześnie?
MatthewMartin,

0

Znalezienie listy liczb pierwszych jest dość powszechnym pytaniem, ale nadal wymaga przemyślenia, a ludzie mogą udzielić odpowiedzi w różnym stopniu.

Byłbyś również zaskoczony, jak wiele osób ma trudności z zaimplementowaniem struktury danych typu Mapa / Słownik.


0

Poprosiłem moich kandydatów o stworzenie programu do obliczania silni danej liczby w dowolnym wybranym przez nich pseudo języku. Jest to dość łatwy problem do rozwiązania i dobrze pasuje do naturalnych pytań uzupełniających (które można często zadawać) na temat rekurencji.

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.