15 задач на собеседовании для программиста

14
74378
Добавить в избранное

В этой статье я расскажу о задачах и вопросах, которые ждут программистов на собеседовании при приёме на работу.


Интервьюеры не отличаются оригинальностью, и один и тот же вопрос можно встретить на 3-5 разных собеседованиях.
Но даже опытные программисты, оказываясь в стрессовой ситуации, нередко теряются и не могут найти ответ на довольно простые вопросы. Поэтому предлагаю заранее потренироваться, проверить свои знания, а заодно и посмотреть на любимые вопросы интервьюеров. Не исключено, что именно на них Вам предстоит отвечать на следующем собеседовании.
Структуры данных и вопросы об алгоритмах – основная часть любого собеседования для программистов вне зависимости от их специализации

1. Как найти средний элемент в LinkedList за один проход?

Это один из самых популярных вопросов на собеседованиях. Его используют даже в телефонных интервью, чтобы быстро определить общий уровень знаний кандидата на роль программиста и оценить его способность быстро решать нестандартные задачи.

Все программисты знают, что средний элемент в LinkedList несложно найти, определив длину списка, последовательно пройдя все его узлы, пока не дойдёшь до NULL в первом проходе. А затем, пройдя половину из них во втором проходе. Когда же их просят решить эту задачу за один проход, многие теряются.

Большинство задач, поставленных на собеседовании, имеет довольно простое решение, и сидя в спокойной обстановке, Вы без особого труда найдёте его сами.

Исходный код решения

2. А если LinkedList зациклен?

3. Этот вопрос может модифицироваться в «Как найти в LinkedList i-тый элемент с конца за один проход?»

Уже знаете ответ?

4.Как определить дублированный элемент в массиве, в котором содержатся элементы типа int от 1 до 100, при условии, что в массиве дублируется только один элемент?

Это вообще задача на логику для средней школы. Многие программисты стремятся её решить длинным перебором/сравнением элементов, но есть куда более рациональный и эстетичный способ.

Догадались, какой?

5.Как изменить порядок элементов в строке на обратный без использования вспомогательных классов?

Один из самых популярных экспресс-вопросов. Есть несколько способов выполнения этого задания, но на собеседовании лучше выбрать самый простой. Не забывайте, что Ваш собеседник далеко не всегда может оценить преимущества длинного, но красивого решения.
Неплохо подойдёт что-то типа этого:

6.Напишите программу для сортировки массива, использующую метод пузырька.

Вопросы по сортировке данных присутствуют почти на каждом собеседовании. Они позволяют нанимателю быстро оценить уровень умений кандидата и определить, соответствует ли этот уровень нужному.

Решить это можно так:

7. В чём разница между стеком (Stack) и очередью (Queue)?

8. Как найти продублированные элементы в массиве, если их больше одного?

9. В чём разница между двусвязным и односвязным списком?

Это один из классических вопросов для телефонного собеседования. Любой программист на него ответит, почти не задумываясь.

10. Напишите программу для вывода чисел Фибоначчи

Если вдруг кто-то не знает, числа Фибоначчи – это последовательность, где каждое следующее число после 1 является суммой двух ему предшествующих. То есть ряд чисел Фибоначчи выглядит так: 1,1, 2, 3, 5, 8, 13, 21…

Решить эту задачу можно так:

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

Палиндром – это набор знаков (слово, число, фраза), в котором все знаки при прямом прочтении полностью совпадают со знаками при обратном прочтении.
То есть палиндромами являются числа 66, 13431, 789987 и т.д.

А после этого дописать этот код так, чтобы он сравнивал полученные цифры.

12. Напишите программу, которая проверит, является ли заданное слово палиндромом

Задача, в принципе, аналогичная предыдущей, но с существенным отличием — использовать операторы / и % не получится.
Используем рекурсию и получим простое и красивое решение:

13. Что такое бинарное дерево поиска?

14. Напишите программу для реализации структуры данных Stack.

Этот вопрос позволяет Вам продемонстрировать свои навыки владения стандартными методами (push и pop) для работы с этой структурой данных. При выполнении этой задачи Вам нужно будет использовать массив или связный список для хранения элементов.
Написать можно, например, программу стандартного калькулятора.

15. Как развернуть LinkedList, используя рекурсию и итерацию?

Ещё один пример очень популярного вопроса. Есть много способов изменения порядка элементов в связанном списке. В следующей статье я рассчитываю подробно осветить их все.
Ждите! Или пишите свои варианты этой программы, не заглядывая в «авторскую версию»!
for java interview

В заключение

Не забывайте, что решая ту или иную задачу на собеседовании, желательно разъяснять каждый логический шаг интервьюеру. На стартовом собеседовании оценивают не только скорость и правильность решения поставленных задач, но и логику мышления в целом.
Именно поэтому иногда даже неполное решение сложной задачи позволит интервьюеру оценить ваши знания как достаточные для вакантной должности.
Даже если Вы опытный программист с десятками реализованных проектов портфолио, не поленитесь перед собеседованием повторить теорию. Ведь ответ «ну это работает где-то так… и вообще, за последние 3 года я ни разу не пользовался этой структурой данных» вряд ли устроит интервьюера.
Часть материалов переведена из этого источника.

Креатива Вам и удачи на собеседовании!

Другие статьи по теме

Подборка материалов и видеокурсов по Java

6 книг по Java для программистов любого уровня

Готовитесь к собеседованию?

Подпишитесь на нашу рассылку, чтобы получать больше интересных материалов:

И не беспокойтесь, мы тоже не любим спам. Отписаться можно в любое время.




Комментариев: 14

  1. Николай Турьев

    import java.util.Scanner;

    /**
    * Способ ршения
    * 1 курентный случай или первой число
    * определить сколько нужно чисел вывести
    * написать функцию выводящую след число как сумму предыдущих двух
    */
    public class Fib {
    static double fibNumber(int n){
    if (n <= 1) return n;
    else {
    return fibNumber(n-1) + fibNumber(n — 2);
    }
    }
    public static void fib(){
    System.out.println("Введите колличество чисел фибоначи: ");
    int number = new Scanner(System.in).nextInt();
    System.out.println("Колличество чисер фибонначи: " + number);
    for (int i = 1; i <=number; i++){
    System.out.println(fibNumber(i));
    }
    }
    }
    public class Main {

    public static void main(String[] args) {
    Fib f1 = new Fib();
    f1.fib();
    }

  2. Антон Керп

    По 4-му заданию. Во первых, в задании не сказано, что в массиве 100 элементов…
    Во вторых:
    Пусть у нас «правильный» массив из 100 элементов с числами от 1 до 100 без повторов { a_i | i=1..100, a_m != a_n для всех m != n }. Сумма элементов пусть равна X. Пусть есть «неправильный» массив, где вместо одного из элементов a_j «правильного» массива второй раз встречается элемент a_k.
    Тогда X = a_1 + a_2 + … a_j-1 + a_j + a_j+1 + … + a_k + … + a_100
    И Y = a_1 + a_2 + … + a_j-1 + a_k + a_j+1 + … + a_k + … + a_100
    X — Y = a_j-1 -a_k
    Хотя ответ должен быть a_k.

    Потом по поводу пузырька. я, конечно, не помню уже в деталях сам метод и не знаю тонкостей этого синтаксиса, но что-то мне подсказывает, что работать везде только с индексом j (а индекс i похоже тупо счётчик итераций онли) и не использовать никакого сравнения элементов — дурные знаки.

  3. Сергей Алещенко

    Первый же алгоритм (LinkedList) неправильный. Браво.

    1. Подскажите, как правильно 🙂

  4. Илья Альтерович

    В 6 задачке — «6.Напишите программу для сортировки массива, использующую метод пузырька.» приложен нерабочий код. Даже не компилируется.
    Вот пример реализации на джава:
    {code}
    public class BubbleSort {
    public static void main(String[] args) {
    int[] unsorted = {32, 39, 21, 45, 23, 3};
    System.out.println(Arrays.toString(bubbleSort(unsorted)));
    int[] test = {5, 3, 2, 1};
    System.out.println(Arrays.toString(bubbleSort(test)));
    }

    private static int[] bubbleSort(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
    for (int j = i; j < arr.length; j++) {
    if (arr[j] < arr[i]) {
    arrSwap(arr, i, j);
    }
    }
    }
    return arr;
    }

    private static void arrSwap(int[] arr, int i, int j) {
    int temp = arr[j];
    arr[j] = arr[i];
    arr[i] = temp;
    }
    }
    {code}

    1. У меня всё собралось и отработало. Какую ошибку пришет компилятор при сборке?

      1. Илья Альтерович

        Аж три ошибки)…
        И все в синтаксисе)
        1) Error:(16, 28) java: ‘;’ expected
        2) Error:(16, 37) java: not a statement
        3) Error:(25, 1) java: class, interface, or enum expected
        очень странно что у вас он скомпилировался)…
        https://imgur.com/hFuzbiq

        1. У вас тут код на скриншоте отличается от приведённого в статье; немудрено что ошибки вылезли — второй for написан синтаксически и логически неправильно. Посмотрите как в статье выглядит второй for и сделайте аналогично, ошибки должны уйти.

          1. Илья Альтерович

            То что там второй for кривой, это я и сам вижу, о чём и говорю что синтаксис, как минимум поломаный)
            Что то очень странное происходит с этим сайтом…
            Вот, скриншот этого сайта и как на нём у меня отображается этот код:
            https://imgur.com/dpg1oaA
            как видите код на обоих скриншотах идентичный.
            на всякий случай открыл в другом браузере (Chrome, Opera) и там и там то же самое.
            Не могли бы вы выложить скриншот с тем как у вас отображается код на сайте? Аж любопытно стало)… Я так пологаю что там ещё где — то и if затерялся «между строчек» после второго цикла?)

  5. В момент, когда 2ой указатель дойдёт до конца списка (наткнётся на NULL), первый будет указывать на середину списка.
    Наверное, наоборот, когда первый указатель дойдёт до конца списка (наткнётся на NULL), второй будет указывать на середину списка.

  6. Я, конечно, придираюсь, но в 4 вопросе условие явно не подразумевает, что в массиве есть ВСЕ элементы от 1 до 100, а не только случайный набор чисел в этом диапазоне, одно из которых дублируется. А вот решение приведено как раз для этого случая.

    Ну и да, как помогает определить уровень кандидата знание пузырьковой сортировки на память? Уже много раз этот вопрос поднимался на разных ресурсах. Задача про тот же палиндром с точки зрения взгляда на мышление кандидата при решении задачи куда как полезнее просто потому, что не надо судорожно вспоминать алгоритм сортировки, а работать в условиях, когда задача довольно подробно описана.

  7. Любое число Фибоначчи можно найти за константное время:

    function getFibonacci(n) {
    return Math.round(((1 + Math.sqrt(5)) / 2) ** n / Math.sqrt(5));
    }

    1. Суть задания-то не в этом. Нам нужно не найти конкретное число Фибоначчи, а вывести ВСЕ на экран. (Под всеми я имею в виду, что программа будет выводить числа их пока мы её не остановим, или пока не вылетит ошибка)

  8. 6.Напишите программу для сортировки массива, использующую метод пузырька.
    А где условие???

Добавить комментарий