JavaRush /Java блог /Random /Разбор типичного тестового задания на позицию разработчик...
Uniges
35 уровень
Санкт-Петербург

Разбор типичного тестового задания на позицию разработчика

Статья из группы Random
Сегодня я бы хотел разобрать ТЗ на позицию стажера-разработчика. Когда-то давно я его писал: хочу поделиться своими соображениями на этот счет.Новичкам будет полезно иметь представление о том, что их ожидает в будущем при трудоустройстве.
Разбор типичного тестового задания на позицию разработчика - 1
Вакансия выглядит следующим образом: Стажер-разработчик PostgreSQL от 30 000 руб. до вычета НДФЛ ООО Бизнес Технологии Санкт-Петербург, Коломяжский проспект, 33к2 Бизнес Технологии Требуемый опыт работы: не требуется
  • Полная занятость, полный день
Обязанности:
  • Реализация задач не высокого уровня сложности под руководством разработчика
  • Постоянный рост квалификации
Требования:
  • Понимания принципов структурного программирования, теории реляционных баз данных.
  • Ответственность, самостоятельность, инициативность
  • Коммуникабельность, умение и желание работать в команде
  • Высокая обучаемость
Желательно:
  • Знание
  • Sql;
  • Pl\sql;
  • Pl\pgSql;
  • C++, java, pascal.
Условия:
  • Работа в стабильной, динамично развивающейся компании
  • Комфортные условия труда
  • Отсутствие формализма и бюрократии
  • Обширные возможности для профессионального и карьерного роста
  • Заработная плата по итогам собеседования
  • Оформление по ТК, оплачиваемый отпуск согласно трудовому законодательству.
  • Просьба в заголовке письма указывать код вакансии: Project04
Описание тестового задания: Тест предназначен для самоконтроля с целью определения соискателю, для себя, стоит ли тратить свое время на собеседование. Псевдокод Данный псевдокод используется для описания алгоритмов.
  1. Отступ от левого поля указывает на уровень вложенности.
  2. Циклы while, for, repeat и условные конструкции имеют тот же смысл, что и в pascal-е.
  3. Символ “--” обозначает комментарий
  4. Символ “:=” обозначает присваивание
  5. Переменные локальны в рамках процедуры, если не оговорено иначе
  6. Индекс массива пишется в квадратных скобках, конструкция A[i] означает i элемент в массиве A
  7. Возможно использование объектов, состоящих из нескольких полей, или имеющих несколько атрибутов, значения поля записывается как ИмяПоля[ИмяОбъекта].

    К примеру, длина массива A записывается как Length[A]; что означают квадратные скобки - выясняется по контексту (переменная, обозначающая массив, или объект является указателем на составляющие его данные). После присвоения y:=x для любого поля f будет выполняться равенство f[y]=f[x]; определение того, что является атрибутом – функция, переменная или что-либо еще, - делается по контексту.

  8. Указатель может иметь специальное значение NIL, не указывающее ни на какой объект.
  9. Параметры передаются по значению: вызванная процедура получает собственную копию параметров, изменения параметров внутри процедуры снаружи не видно. При передаче объектов копируется указатель на данные, соответствующие этому объекту.
Задача Функция сортирующая массив элементов A: Sort(A,p,r) 1 if p < r 2 then q := round_half_down((p+r)/2) 3 Sort(A,p,q) 4 Sort(A,q+1,r) 5 Merge(A,p,q,r) Пример массива: A = (5,2,4,6,1,3,2,6) Примера запуска: Sort(A,1,length[A]) Необходимо: Разработать алгоритм функции Merge(A,p,q,r) на любом удобном вам языке, с использованием дополнительной памяти или без нее, как вам будет быстрее или удобнее в реализации. Если у вас получится - с радостью ждем вас для прохождения дополнительного тестирования. Мой ответ: Алгоритм, описываемый в примере "Псевдокода" - это алгоритм сортировки слиянием (Merge sort). Основная задача нашей функции - отсортировать массив неупорядоченных чисел: например, по возрастанию. Задача разбирается на подзадачи: последовательность чисел из массива разбивается на массивы меньшего размера до тех пор, пока массив не станет однозначным, происходит сравнение элементов массивов, их замена (меньшее на большее, по индексу), слияние.
Разбор типичного тестового задания на позицию разработчика - 2

public class Main {
    public static void main(String[] args) {
        int[] massif = {13, 3, 8, 1, 15, 2, 3, 7, 4};
        System.out.print("Массив до сортировки: ");
        for (int i = 0; i < massif.length; i++)
            System.out.print(massif[i] + " ");
        System.out.println("");
        massif = sort(massif);
        System.out.print("Массив после сортировки: ");
        for (int i = 0; i < massif.length; i++)
            System.out.print(massif[i] + " ");
    }

    public static int[] sort(int x[]) {
        if (x.length == 1) //Рекурсия идет до тех пор, пока массив делится
            return x;
        else {
            int half = (int) Math.floor(x.length / 2); //Разбиваем массив на 2 части
            int halfFirst[] = new int[half]; //1 часть, пустой массив
            int halfSecond[] = new int[x.length - half]; //2 часть, пустой массив
            for (int i = 0; i < x.length; i++) { //Заполняем новосозданные массивы значениями
                if (i < half)
                    halfFirst[i] = x[i];
                else
                    halfSecond[i - half] = x[i];
            }
            halfFirst = sort(halfFirst); //Рекурсия
            halfSecond = sort(halfSecond); //Рекурсия
            x = sortNext(halfFirst, halfSecond); //Отправляем заполненные значениями массивы в следующий метод
            return x;
        }
    }

    public static int[] sortNext(int x[], int y[]) {
        int c[] = new int [x.length + y.length]; //Создаем результирующий массив из суммы длин массивов из аргументов метода
        int a = 0, b = 0;
        for (int i = 0; i < x.length + y.length; i++) { //Сравниваем массивы, меняем местами элементы, заполняем новосозданный массив
            if (a == x.length) {
                c[i] = y[b];
                b++;
            }
            else if (b == y.length) {
                c[i] = x[a];
                a++;
            }
            else if (x[a] > y[b]) {
                c[i] = y[b];
                b++;
            }
            else {
                c[i] = x[a];
                a++;
            }
        }
        return c;
    }
}
Разбор типичного тестового задания на позицию разработчика - 3
Ссылка с рабочим кодом на Ideone: ТУТ Задача была успешно сдана, после чего пригласили на интервью, где, вместо собеседования, в меня кинули очередную порцию подобных задач и удалились на два часа, выдав ручку и 2 листочка А4. Забрали листочки, не посмотрев в них, и сказали, что перезвонят. Мое удовольствие от подобного времяпрепровождения не описать цензурными словами. Но, как минимум, это та суровая реальность, с которой многим придется столкнуться в начале своего пути.
Разбор типичного тестового задания на позицию разработчика - 4
Искренне желаю Вам интересных и конструктивных собеседований. С умом выбирайте работодателя. Всем добра!) П.С.: мой обзор компаний-работодателей за апрель 2018 (Санкт-Петербург) можно посмотреть ТУТ
Комментарии (27)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Andrew Li Уровень 45
19 января 2022
Может быть кому-нибудь будет полезно. С 2018 года ничего не изменилось, тебе выдадут 3 задачи и несколько листков А4, на решение отводится 2 часа. Встречаться и говорить с тобой никто не будет, по факту это не собеседование, а тестирование. Первые 2 задачи элементарные, но они будут на "замечательном" псевдокоде, в котором без 100 граммов не разберешься. Задача номер раз: поработать дебагером в алгоритме сортировки вставками и написать состояние массива на каждой итерации цикла. Пример: 7 9 0 5 -> 7 0 9 5 -> 0 7 9 5 -> 0 7 5 9 -> 0 5 7 9 Задача номер двас: нужно вставить элемент в начало связного списка... это все. Последняя задача: дана таблица, на ее основе вычисляются какие-то значения. Нужно было вывести формулы, согласно которым происходит расчет. Бизнес логику этих расчетов я так и не вкурил, ибо описание задания было максимально размытое и куцое. Листы с задачами просят не комкать и не писать на них (какие бережливые люди, о природе заботятся), значит с вероятностью в 99% всем дают одинаковое задание, на этих самых листах. Вести общение и встречать тебя будет девушка - офис-менеджер (скорее всего), HR в компании просто нет. Декорации, в которых будет происходить все действо, выглядят довольно сдержанно, если не сказать бедно.
Andrew Li Уровень 45
14 января 2022
Позвали на тестирование в офис, если все же решусь, оставлю тут кул стори.
Май Уровень 11
14 января 2022
Вакансия с этим тестовым всё ещё на месте. :)
ric ric Уровень 25
16 июня 2021
ловите, не благодарите ;)

import java.util.Arrays;


public class Main {
    public static void main(String[] args) {

        
        int[] arr = new int[]{5,2,4,6,1,3,2,6,7,4,9,7,8,11,21,42,3};
        int r = arr.length - 1;
        // в условии p = 1, под 1 понимается первый элемент массива, в java это элемент с индексом 0
        int p = 0;
        sort(arr, p, r);
        System.out.println(Arrays.toString(arr));

    }


    public static void sort(int[] A, int p, int r) {
        if (p >= r) return;

        int q = (p + r) / 2;
        sort(A, p, q);
        sort(A, q + 1, r);
        merge(A, p, q, r);
    }

    public static void merge(int[] A, int p, int q, int r) {

        int n1 = q - p + 1;
        int n2 = r - q;
        int[] L = new int[n1 + 1];
        int[] R = new int[n2 + 1];
        L[n1] = 10000;
        R[n2] = 10000;
        System.arraycopy(A, p, L, 0, n1);
        for (int j = 0; j < n2; j++) {
            R[j] = A[q + j + 1];
        }
        int x = 0, y = 0;
        for (int k = p; k <= r; k++) {
            if (L[x] <= R[y]) {
                A[k] = L[x];
                x++;
            } else {
                A[k] = R[y];
                y++;
            }
        }
    }
}
levord Уровень 27
28 апреля 2021
Апрель 21 года. Вакансия на разработчика, но тестовое то же. Один в один. Обрадовался, что есть помощь в решении. Дочитал до конца статью. Расстроился, что потом еще 2 часа на бумаге царапать им что-то...
Roman Afonin Уровень 35
6 февраля 2020
А вакансия каждую неделю у них так и вывешивается) Значит, не стоит туда даже и ходить?
Незнайка Уровень 40
16 октября 2018
В задании было реализовать мерге, я один не заметил не выполнение задания?
Чебурешь :3 Уровень 17
27 мая 2018
Если везде такие задания то я на работу не устроюсь... Это печально... Пойду напьюсь... Воды.
Джон Дориан Уровень 37
10 мая 2018
Довольно странно со стороны компании давать "задание", которое гуглится за минуту. Хотя, справедливости ради - я с таким тоже сталкивался в одной из контор. Пришел домой и нагуглил точь-в-точь; причем не только решение, но и само задание слово в слово
iloveski Уровень 37
9 мая 2018
Вот только кто когда последний раз сам писал реализацию сортироки. Достаточно твердо знать какие алгоритмы сортировки есть и в чем их отличия, когда какие применять. Так что тестовое ужас. Лучше уж проверить знание стека библиотек из своего проекта