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

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

Стаття з групи Random UA
Сьогодні я хотів би розібрати ТЗ на позицію стажера-розробника. Колись давно я його писав: хочу поділитися своїми міркуваннями щодо цього.Новичкам буде корисно мати уявлення про те, що на них чекає в майбутньому при працевлаштуванні.
Розбір типового тестового завдання на позицію розробника.
Вакансія виглядає так: Стажер-розробник PostgreSQL від 30 000 руб. до відрахування ПДФО ТОВ Бізнес Технології Санкт-Петербург, Колом'язький проспект, 33к2 Бізнес Технології Необхідний досвід роботи: не потрібно
  • Повна зайнятість, повний день
Обов'язки:
  • Реалізація завдань не високого рівня складності під керівництвом розробника
  • Постійне зростання кваліфікації
Вимоги:
  • Розуміння засад структурного програмування, теорії реляційних баз даних.
  • Відповідальність, самостійність, ініціативність
  • Комунікабельність, уміння та бажання працювати в команді
  • Висока навченість
Бажано:
  • Знання
  • Sql;
  • Pl\sql;
  • PlgpqSql;
  • 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). Основне завдання нашої функції – відсортувати масив невпорядкованих чисел: наприклад, за зростанням. Завдання розбирається на підзавдання: послідовність чисел з масиву розбивається на масиви меншого розміру до того часу, поки масив стане однозначним, відбувається порівняння елементів масивів, їх заміна (менше більше, за індексом), злиття.
Розбір типового тестового завдання на позицію розробника.
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 року (Санкт-Петербург) можна подивитися ТУТ
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ