JavaRush/Java блог/Random/Опыт прохождения собеседования
Galina
8 уровень

Опыт прохождения собеседования

Статья из группы Random
участников
Собеседовалась я в одну Американскую компанию, у которой есть офисы и в Санкт-Петербурге, и в Саратове, и в Харькове, и в Польше, ну и в Силиконовой долине Калифорнии. Много русских там.
собеседование ИТ
Назначили мне техническое интервью на позицию junior QA with java. Я готовилась, писала ручкой на бумаге код задачек по массивам, спискам, коллекциям. Без подглядывания куда-либо. Это, кстати, оказалось не просто. Интервью было по hangouts. В начале собеседования интервьюер попросил рассказать о себе. Затем перешли к задачкам. Он пошарил документ со мною, где был код и мы оба одновременно видели действия друг друга. Первая задачка была на массив с вариантами ответов. Я не буду давать здесь ответ, но хочу предупредить что нужно быть внимательным. Легко проанализировать начало выполнения кода и не заметить небольшой подвох ближе к концу.
//Task1
// What will be the value of the “values” variable after execution of the following code snippet?
//
    public static void main(String[] args) {
        int[] values = {23, 12, 13, 17, 23, 19};

        for (int i = 0; i < values.length - 1; i++) {
            if (values[i] > values[i + 1]) {
                int t = values[i];
                values[i] = values[i + 1];
                values[i + 1] = t;
            }
        }
    }

// 1. {12, 13, 17, 19, 23, 23}
// 2. {23, 23, 19, 17, 13, 12}
// 3. {12, 13, 17, 23, 19, 23}
// 4. {12, 13, 23, 17, 19, 23}
Интервьюер спрашивал "Что делает задачка?" и "Какой вариант ответа правильный?". И "Что напоминает эта задачка?" На последний вопрос я ответила, что напоминает сортировку пузырьком, только там два цикла и один вложенный, который начинается с конца. Эту задачку я решила. И даже обрадовалась, что легко было. Затем шла вторая задачка "Счастливый билет". Где сумма первых трех цифр равна сумме трех последних в 6-ти значном числе.
// Task2
// boolean isMyTicketLucky(? ticketNumber);

// Notes:
// - You need to choose a type of the ticketNumber input parameter yourself.
// - Ticket number consists of 6 digits like 123456 or 404404.
// - The method returns true if sum of the first three digits is equal to sum of the last three digits.
// If the sums are different the method returns false.

    public static void main(String[] args) {
        //isMyTicketLucky("123006");
        System.out.println(isMyTicketLucky("123006"));
    }
Здесь нужно самому выбрать тип номера билета во входящем параметре. Integer или String. Для обоих типов есть решение задачки. Решение для типа билета Integer.
private static boolean isMyTicketLucky(int ticketNumber) {

        int number1 = ticketNumber / 100000;
        int number2 = (ticketNumber / 10000) % 10;
        int number3 = (ticketNumber / 1000) % 10;
        int number4 = (ticketNumber / 100) % 10;
        int number5 = (ticketNumber / 10) % 10;
        int number6 = ticketNumber % 10;

        return number1 + number2 + number3 == number4 + number5 + number6;
    }
Решение для типа билета String.
private static boolean isMyTicketLucky(String ticketNumber) {
        return ticketNumber.charAt(0) + ticketNumber.charAt(1) + ticketNumber.charAt(2)
                == ticketNumber.charAt(3) + ticketNumber.charAt(4) + ticketNumber.charAt(5);
    }
К сожалению я растерялась и не смогла решить вторую задачку во время интервью. После задачек были вопросы о SQL, SQL Join, system version control. Ну и совсем в конце спросил "Есть ли вопросы?" Я попросила дать критику моего собеседования, и интервьюер отметил, что ему понравилось, что я вслух рассуждала что делал код в первой задачке. Я прям шла по коду и проговаривала, что делает каждая строка и каждая итерация в цикле. Это было мое первое интервью в IT. Я его не прошла, но зато я знаю над чем работать сейчас и что подучить.
Комментарии (15)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Mr. Alex
Уровень 16
30 сентября 2018, 21:07
Вот еще решение для второй задачки (Для String) "Счастливый билет" - сумма первых цифр равна сумме последних в числе. Если эти сумы равны, значит сумма этих сумм равна 0 =). Тогда мы сразу можем добавлять первые [0..N/2) и отнимать последнее [N/2, N) цифр, где N - количество цифр в числе.
private static boolean isMyTicketLucky(final String ticketNumber) {
        final int blockLength = ticketNumber.length() / 2;
        int sum = 0;
        for (int i = 0; i < blockLength; i++) {
            sum += ticketNumber.charAt(i) - ticketNumber.charAt(blockLength + i);
        }
        return sum == 0;
}
Что-то подобное можно для integer написать, используя деление. Можно еще рекурсивное деление сделать, но это плохой подход.
Евгений Иванов
Уровень 39
26 сентября 2018, 19:09
Первая задачка должна кидать ArrayIndexOutOfBoundsException
Евгений Гродно
Уровень 36
Expert
3 мая 2018, 21:20
Одно из решений, лучше делегировать уже реализованному, и так как со String получилось симпатичней и короче, отправляем int в метод обработки.
private static boolean isMyTicketLucky(int ticketNumber) {
return isMyTicketLucky(new String(ticketNumber));
}
Ярослав Java Developer Master
4 мая 2018, 20:52
Может быть, однако суть была именно в написании решения для int, а еще оно должно, по идее, быстрее работать.
Евгений Гродно
Уровень 36
Expert
4 мая 2018, 22:17
почему быстрее, загляните в String, как там все хранится. Я не думаю, что у JVM будет занимать много времени, забрать чары и сложить их. Хотя для чистоты, нужно тест времени пилить. И я не думаю что на собеседовании от вас ждут конкретное решение, им нужно посмотреть как вы думаете, и потом принять решение, могут ли они из вашей думалки, бабосы клепать =)
Ярослав Java Developer Master
2 мая 2018, 07:53
int number3 = (ticketNumber / 1000) % 10 % 10;
int number4 = (ticketNumber / 100) % 10 % 10 % 10;
int number5 = (ticketNumber / 10) % 10 % 10 % 10 % 10;
int number6 = ticketNumber % 10 % 10 % 10 % 10 % 10;
Что это за безумный код? Зачем по 6 раз остаток от деления на 10 искать? Достаточно же раза. У нас на первом семестре первого курса уже бы за такое расстреляли))) Данный код очень хорошо демонстрирует, что суть написанного тот, кто писал код, не понимает. Есть число например: 123456. Когда мы делаем деление на 10 - мы отсекаем одну цифру справа. Отсекаем мы N чисел, где N - степень десятки. 123456/10 = 12345 А остаток от деления нужен, чтобы вытащить последнюю цифру. 12345%10 = 5. Потому мы просто срезаем одну цифру и достаем новую последнюю цифру числа. Когда же запись есть, вроде: int number6 = ticketNumber % 10 % 10 % 10 % 10 % 10; То: 123456%10 = 6. 6%10 = 6 6%10 = 6 6%10 = 6 6%10 = 6 Просто бесполезные команды.
Roman Sharun
Уровень 41
2 мая 2018, 18:07
Вы же понимаете, что на собеседованиях могут быть разные методы решения с целью проверить знания собеседуемого и разные степени ответа на вопрос. Вы в этом своем ответе предложили рациональный способ, что служило бы на собеседовании доп. балом.
Galina
Уровень 8
5 мая 2018, 04:18
Да, спасибо! Было не очень умно писать %10 много раз. :) Разобралась!
Vladimir
Уровень 40
Master
2 мая 2018, 03:03
Самое важное, что в таких случаях debugger у тебя в голове клацает F7. Рядом его нет, как и нет IDE. И тут становится ясно, в теме ты или нет. :)
Tural Aliyev
Уровень 11
2 мая 2018, 01:22
кайф
Galina
Уровень 8
2 мая 2018, 02:40
Вы имеете ввиду, что эти задачки и вопросы вам понятны и вы с легкостью с ними справитесь?
Tural Aliyev
Уровень 11
7 мая 2018, 02:36
Да , довольно простенькие задачки.
Galina
Уровень 8
14 мая 2018, 21:21
ну и позиция тоже простенькая )
Galina
Уровень 8
30 мая 2018, 17:59
Это, кстати, было только первое техническое интервью. За ним должно было бы быть Face to face интервью, часа на 3-4 у них в офисе. Там тоже должны быть задачки и маркерная доска для их решения. Думаю там посложнее.
Taras Kutselya
Уровень 24
10 октября 2018, 21:16
Вот вам пример задачки с моего собеседования на Java курсы: