Головоломка FizzBuzz

Вопрос FizzBuzz — очень классический вопрос, который задают во многих интервью по всему миру. Есть много способов сделать это на разных языках. Но в самых общих чертах это определенно включает использование 3 или 4 циклов if/else if. Есть причудливые способы сделать это, если мы заходим на территорию Java 8 и тому подобное. Но мой главный вопрос таков:

  • Какова логика этого знаменитого вопроса?
  • Что интервьюеры ищут в кандидате, когда задают этот вопрос?
  • Знаем ли мы, как кодировать базовые вещи?
  • Они хотят видеть наш стиль кодирования?
  • Ожидают ли они оптимизации в этом вопросе? Трудно пытаться оптимизировать код.

Вот математический взгляд на это:

если количество циклов = 100

Расчет %15 = 100

Расчет %3 = 100 - 6 = 94

Расчет %5 = 100 - 33 = 67

Общий расчет модуля = 261 (100 + 94 + 67)


person shd293    schedule 08.02.2018    source источник


Ответы (2)


Какова логика этого знаменитого вопроса?

Это искренне отсеять людей, которые понятия не имеют, что они делают.

Что интервьюеры ищут в кандидате, когда задают этот вопрос?

Самое главное для меня это начало разговора. Например, вы можете попросить людей объяснить свой код, почему они выбирают x % 15 == 0 вместо x % 3 == 0 && x % 5 == 0.

Знаем ли мы, как кодировать базовые вещи?

Да, условия; петли; операторы

Они хотят видеть наш стиль кодирования?

Да, это может быть про оптимизацию или просто разговор. Процесс собеседования заключается в том, чтобы понять человека перед вами. (и это идет в обе стороны).

Ожидают ли они оптимизации в этом вопросе?

Это зависит от того, я думаю, что есть комбинация if elseif и различных способов зацикливания. Как правило, каждый интервьюер должен дать свой ответ на вопрос. Например, в C# я бы включил в свой тест элемент управления памятью с ожиданием yield return.

Вы можете прочитать публикацию Джеффа Этвуда на эту тему.

person Ashley Medway    schedule 08.02.2018
comment
Спасибо за ответ. Я хотел бы еще раз спросить об этом, поскольку вы указали на% 15. Является ли использование% (5 * 3) или% 3 &&% 5 вместо первого пути? - person shd293; 08.02.2018
comment
@ shd293 они просто разные, в интервью я бы просто спросил, почему вы предпочитаете делать это одним способом, а не другим. На самом деле нет правильного или неправильного ответа. Можно сказать, что %15 более эффективен, поскольку вы проверяете только одно условие. - person Ashley Medway; 08.02.2018

Недавно мне задали этот вопрос в интервью, я не тратил много времени на размышления, просто написал простой метод Java, который принимает целое число и возвращает соответствующее слово Fizz Buzz, и я задал вопрос интервьюеру, каково ожидаемое изменение в программа, и он сказал, что другое условие, например, число, кратное 7, напечатайте «СЕМЬ», поэтому я немного реорганизовал, и окончательный ответ был примерно таким, как показано ниже.

 public static void main(String[] args) {

    Function<Integer,String> fizz = e->e%3==0?"FIZZ":"";
    Function<Integer,String> Buzz = e->e%5==0?"BUZZ":"";
    Function<Integer,String> fizzBuzz = e->e%3==0 && e% 5==0?"FIZZBUZZ":"";
    Function<Integer,String> seven = e->e%7==0?"SEVEN":"";
    List<Function<Integer, String>> predicateList = List.of(fizz,Buzz,fizzBuzz,seven);
    IntStream.range(0,100).boxed()
                        .map(e->applyFizzBuzzFunc(e,predicateList))
                        .forEach(System.out::println);
}

/**
 * Executes the list in the given order 
 */
private static String applyFizzBuzzFunc(Integer e, List<Function<Integer, String>> predicateList) {
    return predicateList.stream()
                        .map(f -> f.apply(e))
                        .filter(s -> !"".equals(s))
                        .findFirst()
                        .orElse(String.valueOf(e));
}

Я мог видеть, что интервьюер был весьма впечатлен решением. На мой взгляд, будьте максимально интерактивны с интервьюером и постарайтесь понять, что именно он пытается проверить.

person Rahul B    schedule 06.06.2018
comment
Это крутой способ, спасибо за решение: D В java 8 я узнал, что это можно сделать в 4-5 строк. - person shd293; 23.06.2018