Привет! Особенно @kesn сейчас расскажу почему!
Ко мне в телеграмм постучалась очень приветливая и милая девушка HR из Яндекса, с предложением о работе. Я очень обрадовалась, особенно потому, что рынок IT в 2023 очень нестандартный :-)
Созвонились на 15 минут, мне рассказали об этапах - три алгоритмических интервью, по две задачи в течение часа, третье - с независимым экспертом Яндекса и на целых 1,5 часа. Скинули ссылки на leetcode, CodeRun, пара видео с разбором задачек на доске с фломастером и статья Яндекса о том, как они нанимают бэкэнд разработчиков.
Я просмотрела эти материалы и достаточно быстро нашла статью. Хм, интересно! Изначально у меня не было высоких ожиданий относительно интервью, у меня двухлетний опыт Java разработки, и нет идей как алгоритмический live-coding в три этапа поможет вычленить нужного проекту кандидата. И да, я не готовилась.
Интервью 1. Очень приятный молодой человек, прекрасно вел интервью и поддерживал, так как видел мое волнение.
Задача 1
Для заданной строки s и целого числа k вернуть длину самой длинной подстроки s, содержащей не более k различных символов.
Input: s = "eceba", k = 2
Output: 3
Решение:
public class Main {
public static void main(String[] args) {
String s = "eceba";
int k = 2;
System.out.println(lengthOfLongestSubstringKDistinct(s, k));
}
public static int lengthOfLongestSubstringKDistinct(String s, int k) {
if (k == 0 || s == null || s.length() == 0) {
return 0;
}
if (s.length() < k) {
return s.length();
}
Map<Character, Integer> map = new HashMap<>();
int left = 0;
int max = 1;
for (int right = 0; right < s.length(); right++) {
char c = s.charAt(right);
map.put(c, map.getOrDefault(c, 0) + 1);
while (map.size() > k) {
char leftChar = s.charAt(left);
if (map.containsKey(leftChar)) {
map.put(leftChar, map.get(leftChar) - 1);
if (map.get(leftChar) == 0) {
map.remove(leftChar);
}
}
left++;
}
max = Math.max(max, right - left + 1);
}
return max;
}
}
Окей!
Ожидаю вторую, я осведомлена о потоке задач, который должен на меня свалиться. Но вау! Второй задачи на первом интервью нет! Как воодушевляет! Вместо этого интервьюер задавал вопросы про работу HashMap, TreeMap, его вращение, потокобезопасность, ну круто!
Интервью 2. Еще более молодой и такой же приятный человек начинает интервью.
Задача 1
Перенести нули в конец массива, сохранив порядок остальных элементов
[1,0,8,9] → [1,8,9,0]
Решение:
public class Main {
public static void main(String[] args) {
int[] nums = {1, 0, 8, 9};
moveZeroes(nums);
for (int i : nums) {
System.out.print(i + " ");
}
}
public static void moveZeroes(int[] nums) {
if (nums == null || nums.length == 0) return;
int insertPos = 0;
for (int num: nums) {
if (num != 0) {
nums[insertPos++] = num;
}
}
while (insertPos < nums.length) {
nums[insertPos++] = 0;
}
}
}
Задача 2
Дан массив из нулей и единиц. Нужно определить, какой максимальный по длине подинтервал единиц можно получить, удалив ровно один элемент массива.
[1, 1, 0]
Окей! Держите решение, которое не понравилось интервьюеру, кажется, он хотел вычислять максимальный подынтервал в процессе сканирования массива, но я туго понимала намеки и вышла по таймингу, задача не засчитана.
Решение:
class Main {
public static void main(String[] args) {
int[] arr = {1, 1, 0};
System.out.println(maxOnesAfterRemoveItem(arr));
}
static int maxOnesAfterRemoveItem(int[] arr) {
List<int[]> ones = new ArrayList<>();
List<Integer> zeros = new ArrayList<>();
int n = arr.length;
int l = 0;
for (int r = 0; r < n; r++) {
if (arr[r] == 0) {
ones.add(new int[]{l, r});
zeros.add(r);
l = r + 1;
}
}
ones.add(new int[]{l, n});
int maxOnes = 0;
for (int i = 0; i < zeros.size(); i++) {
int onesBefore = ones.get(i)[1] - ones.get(i)[0];
int onesAfter = ones.get(i + 1)[1] - ones.get(i + 1)[0];
maxOnes = Math.max(maxOnes, onesBefore + onesAfter);
}
return maxOnes;
}
}
После этого интервью я решила посмотреть откуда генерируют задачки и была невероятно удивлена, что они уже встречались пару лет назад. Как-то странно, это же первая ссылка по запросу “Собеседование Яндекс”. Окей, думаю случайность, продолжу не готовится!
С предварительным фидбэком мне позвонила HR, сказала, что не все так плохо, но предложила перенести третий этап на осень. Наверно, она думала, что я готовлюсь, но мы-то с вами знаем, что нет, и на следующий день я попросила независимого эксперта.
Интервью 3. Независимый эксперт очень суров и непреклонен, никакой вежливости, только хард скиллы!
Задача 1
Дан отсортированный массив чисел а, индекс элемента index и целое число k. Необходимо вернуть в любом порядке k чисел из массива, которые являются ближайшими по значению к элементу а[index].
find_k_closest(a={2,3,5,7,11}, index=3, k=2) -> {5,7}
find_k_closest(a={4,12,15,15,24}, index=1, k=3) -> {12,15,15}
find_k_closest(a={2,3,5,7,11}, index=2, k=2) -> {5,7} или {3,5}
Решение:
public static List<Integer> findKClosest(int[] a, int index, int k) {
int left = index - 1;
int right = index + 1;
List<Integer> result = new ArrayList<>();
result.add(a[index]);
if (k == 0) {
return result;
}
result.add(a[index]);
k--;
while(k-- > 1) {
if(left < 0) {
result.add(a[right++]);
} else if(right >= a.length) {
result.add(a[left--]);
} else if(Math.abs(a[left] - a[index]) <= Math.abs(a[right] - a[index])) {
result.add(a[left--]);
} else {
result.add(a[right++]);
}
}
return result;
}
}
Задача 2
Дан массив точек с целочисленными координатами (x,y). Определить, существует ли вертикальная прямая, делящая все точки, не лежащие на ней, на 2 симметрических относительно этой прямой набора точек. Наборы симметричны когда каждая точка исходного массива имеет пару из другого набора.
Оу, формулировка кажется такой знакомой... В тайминг я опять не уложилась, интервью закончилось, как и предыдущие, через час.
Решение:
class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Point point = (Point) o;
return x == point.x && y == point.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
}
public class Main {
public static void main(String[] args) {
Point[] points = {new Point(1, 1), new Point(2, 2), new Point(-1, 1), new Point(-2, 2)};
System.out.println(hasSymmetry(points)); // true
}
public static boolean hasSymmetry(Point[] points) {
int sumX = 0;
Set<Point> pointSet = new HashSet<>();
for (Point point : points) {
sumX += point.x;
pointSet.add(point);
}
double avgX = 1.0 * sumX / points.length;
for (Point point : points) {
int symX = (int) (2 * avgX - point.x);
if (!pointSet.contains(new Point(symX, point.y))) {
return false;
}
}
return true;
}
}
После последнего интервью я снова проверила откуда задачи. Вау, это не случайность.
Мои наблюдения вдобавок к тем выводам, что сделал @kesn
Ну, очевидно, количество задач уменьшилось, первый собес так вообще очень вдохновлял той частью с фундаментальными вопросами;
Появился независимый эксперт, хотя я не поняла, в чем разница, кроме той, что он был визуально строг. Для меня это было самое спокойное интервью, потому что давали много тишины и спокойствия, при этом не теряя вовлеченности в процесс;
Яндекс повторяется в задачах, даже если они разобраны на Хабре. С чем это может быть связано и как аффектится на найм - оставлю эти и другие вопросы на рефлексию каждому!
Комментарии (75)
litalen
31.10.2024 10:22я очень обрадовалась
Я просмотрела
Автор: JShipov
Хм.
Px2
31.10.2024 10:22И зачем это все? Вопрос риторический, но всё же.
Программисты никому не нужны, а нужны разработчики. Если ты бэкендер на джаве и не умеешь работать с Кафкой и Кубером, то будь хоть чемпионом Литкода, работу не получишь
gudvinr
31.10.2024 10:22И зачем это все? Вопрос риторический, но всё же.
Могут себе позволить отсеять хороших разработчиков, т.к. поток большой
На таких объемах пользователей, запросов и кол-ва данных, какие есть у яндекса, умение на практике реализовывать оптимальные алгоритмы намного большую важность имеет, чем в мелких конторах, где квадратную сложность на типичных рпсах будет не видно
Это не оправдание яндекса, потому что процесс найма ужасный. Пока ты все этапы пройдешь, в других местах тебе уже офферов накидают.
Вероятно, это можно сделать иначе и без насилия над разработчиком, но т.к. поток людей большой, то так проще и работает приемлемо.
Из заголовка могло показаться, что в процессах что-то изменилось и статья именно об этом, но оказалось что не поменялось ничего.
Если ты бэкендер на джаве и не умеешь работать с Кафкой и Кубером, то будь хоть чемпионом Литкода, работу не получишь
Ну зачем такая дихотомия? Это ведь не исключает друг друга. Можно быть и чемпионом литкода и уметь работать с кафкой и кубером. Плюс в некоторых областях кафки или кубера может и не быть. Может быть не на джаве, но всё же.
alek0585
31.10.2024 10:22Если ты бэкендер на джаве и не умеешь работать с Кафкой и Кубером, то будь хоть чемпионом Литкода, работу не получишь
Сразу скипаю вакансии, где пишут про конкретный стек и ищут code-monkey под него, а не разработчика, который в принципе всегда сталкивается с чем-то новым. А это новая мода на бекендера вешать задачи девопса, но не добавлять к зп... Какой-то совиный грипп что ли?
TheKnight
31.10.2024 10:22Мне пригодился бы хороший программист на Java, даже если он не умеет работать с Кафкой и Кубером.
На моем проекте их все равно нет, да и не нужны они в разработке плагинов для IDE.
BugM
31.10.2024 10:22И Кафка и Кубер осваиваются ну за месяц наверно. На уровне обычного разработчика который использует ваш уже написанный код и что-то строит дальше. Если разработчик получше или ваш код получше, то и пары недель хватит.
А вот умение писать на Джаве с какими-нибудь приколами вроде отладки многопоточки или отладки распределенных систем и реальный опыт из этого получать надо получать годами.
Так что берем просто хороших разработчиков. Из технологий требуем только то что все работавшие должны знать. SQL, Spring и наверно все. Запрос с джойной и групбаем написать может? Как работают бины в общих чертах представляет? Ну и хорошо, дальше проверяем что код писать умеет.
panzerfaust
31.10.2024 10:22И Кафка и Кубер осваиваются ну за месяц наверно
А вот умение писать на Джаве с какими-нибудь приколами вроде отладки многопоточки или отладки распределенных систем и реальный опыт из этого получать надо получать годами.
Тут вроде про литкод речь. Он за тот же месяц осваивается. И многопоточка осваивается, если каждый день сталкиваешься. Не за месяц, но в близкой перспективе.
Абсурд же в том, что есть всё это множество навыков разработчика, но всех интересует конкретный один - и при этом даже не прикладной.
Alpensin
31.10.2024 10:22Он за месяц осваивается или очень способным человеком, или если это скорее в рамках повторения уже имевшихся знаний. Среднестатистический разраб за месяц стабильно решать задачи уровня medium не натренируется. Не говоря о харде.
panzerfaust
31.10.2024 10:22Кафка с Кубером за месяц тоже далеко не на 100% осваиваются. Но достаточно для работы. Литкод нет смысла задрачивать до харда, если задача пройти собес и забыть этот невероятно полезный навык. А в этой ситуации месяца хватит, особенно если без работы сидишь.
CorwinH
31.10.2024 10:22Кафка с Кубером за месяц тоже далеко не на 100% осваиваются.
А что нужно знать про Кафку и Кубер разработчику? То есть, тому, кто их использует, а не администрирует (устанавливает/настраивает).
Предположим, что разработчик знает про Очереди и Контейнеры. Если собрать всю требующуюся ему информацию о Кафке или Кубере в один документ, какого объёма документ получится (1 час/10 часов/100 часов)?
panzerfaust
31.10.2024 10:22Иногда все "администрирование" заключается в том, что вам просто сообщают, где развернуты эти сервисы. Дальше разработчик сам. Насколько ты понимаешь, что делаешь, - так оно и будет. Я не говорю, что это классно и правильно, но так бывает. В часах не считал, но не все всегда получается хорошо слёту. Люди вон целые статьи пишут, как они по подводным камням бродили.
С другой стороны если вы в бигтехе работаете, то у вас там вся кафка это какой-то интерфейс с 2 функциями send и receive, который написала команда платформы. Тогда и 5 минут хватит, чтобы "кафку освоить".
CorwinH
31.10.2024 10:22Дальше разработчик сам. Насколько ты понимаешь, что делаешь, - так оно и будет.
Спасибо. То есть, насколько я понял, разработчиков с обязательным знанием Кафки ищут в там, где заранее решили администрирование Кафки, Кубернетиса и т.п. (а заодно и весь девопс, наверное) свалить на разработчиков?
kasiopei
31.10.2024 10:22Какая разница между программистом и разработчиком? В каких книгах почитать?
danielsedoff
31.10.2024 10:22Я думаю, те, кто разводит эти понятия, имеют в виду, что разработчик — это человек, работающий для кого-то и, скорее всего ч в команде, и решает задачи. А программист — это может быть человек, который пишет код для себя, для условной науки и т.д.
Nanosek
31.10.2024 10:22Уже никто из уважающих себя разработчиков не идет работать в яндекс. А что там делать? Зп низкие, а требования очень высокие, при этом работать там надо на 200%. Тот яндекс который когда то был, куда все хотели попасть ради отметки в трудовой, что ты работал в Яндексе, после чего тебе все двери были открыты, такого уже давно нет.
Мне они постоянно спамят во все мессенджеры, с предложениями по работе, отказов не понимают, даже грубых. Что говорит о явном дефиците кадров.
mostodont32
31.10.2024 10:22Если тебе хорошую зарплату не предложили, мб дело в тебе, а не в Яндексе?:)
DarthVictor
31.10.2024 10:22Если тебе хорошую зарплату не предложили, мб дело в тебе, а не в Яндексе?:)
А если хорошую зарплату предложили все кроме Яндекса, то дело наверное в Яндексе.
mostodont32
31.10.2024 10:22Ну это же чистой воды демагогия. Где цифры? Я вот захожу на levels.fyi и вижу, что у Яндекса средняя зарплата на том же грейде выше, чем в Сбере, вк, озоне, wb...
Смотрю к себе в кошелек и вижу там зарплату выше рынка.
А потом захожу в комменты на Хабре и тут мне сообщают, что я нищий и компания моя всем недоплачивает.
Может поделитесь, откуда информация, что в Яндексе ниже рынка платят?Alpensin
31.10.2024 10:22Человек пояснил, что по себе судит. Ему в других местах больше дали. Возможно на том же грейде в других компаниях работают специалисты послабее. Но платят им столько же.
uxgen
31.10.2024 10:22Хорошую работу спам-боты не рекламируют.
Лет 6 назад ради интереса прошел все интервью и получил офер на юи-щика на 100к с таким видом, что это лучшее предложение в моей жизни. В то время получал в 2 раза больше. До этого делал навигатор который лучше работал на мобилках и мог строить маршруты в офлайн на древних андроидах. В бэкэнд и навигацию даже не позвали.
rpc1
31.10.2024 10:22Опишу свой опыт, 3 года назад прошел собеседование в Яндекс на старшего разработчика (успешно) и они предложили мне ЗП ниже зарплаты, чем в то время на моем текущем месте (даже с учетом подписного бонуса если его включить в годовой доход), несколько раз они оффер переписывали, примерно добили до моего текущего уровня (это с подписным бонусом, который выплачивается в первый год и премиями). Сказали если хочешь больше, то переезжай в Москву, в итоге на этом расстались.
В то время я получил 4 оффера и от Яндекса была самая маленькая сумма.
p.s. и еще не понравилось, то что HR давит постоянно. У вас есть 3 (или 7 дней точно не помню)дня для принятия решения (у них там очередь за забором), потом еще 7 дней дали, потом пропали и через 3 недели еще раз вернулись спросить не передумал ли я.Dan_Te
31.10.2024 10:22Грустно. Если был личный контакт кого-нибудь из нанимающих (тех, кто проводил финалы), стоило им об этом написать, может, выписали бы рекрутеру п%%дов.
panzerfaust
31.10.2024 10:22На литкоде такой замечательный банк задач по SQL. И SQL - это, блин, реальность, с которой каждый бэкендер столкнется. Но нет, давайте до посинения считать подстроки в строках.
Serge1001
31.10.2024 10:22Вот кстати реально SQL же постоянно используем, почему бы его на лайвкодинге не спрашивать вместо алгоритмических задач...
Помимо литкода, кстати, ещё на codewars есть большой банк задач по sql.
Dan_Te
31.10.2024 10:22Какой смысл спрашивать sql? Если человек умеет программировать на нормальном языке, то sql учится за день. За два дня можно свой инстанс наиболее используемой БД поднять и прямо на нем потренироваться.
Но в обратную сторону не работает, если человек знает sql и не умеет прогать, то знание sql ему не поможет примерно никак.panzerfaust
31.10.2024 10:22sql учится за день
Я б даже поверил, если б не видел и не исправлял множество идиотских кверей. Видимо, у их авторов не было этого дня, или они потратили его на вращение деревьев.
40kTons
31.10.2024 10:22Последняя задача ввела в ступор конечно, ибо не любитель геометрии. Точки из набора имеют целочисленные координаты. Окей. А прямая должна иметь целочисленные координаты? Вертикальная, значит, нас интересует только x что бы задать прямую. Окей. Симметричные точки относительно прямой это как? Мол, если на прямой есть коориданата (x, y), то симметричные ей точки это (x + a, y) и (x - a, y)? Нууу, вот так сразу вообще ничего в голову не приходит как её даже теоретически можно начать решать. Кажется, что x нас очень интересует. Можно попробовать отсортировать набор точек по координате x, поскольку ищем симметричный набор точек, то таких точек будет чётное количество, значит, надо взять среднеарифметическое двух центральных точек из отсортированного массива, провести через эту среднюю точку вертикальную линию, и от этой линии влево и вправо сравнивать точки. Если они не симметричны, то набор не симметричен. Если дошли до конца, значит, набор симметричен. Может я в чём то ошибаюсь
venanen
31.10.2024 10:22Все верно. Только центральные точки - это не очень удобно, надо сравнивать влево и вправо. Берём первую и последнюю, берём их среднее по координате Х, и идём двумя указателями с конца и с начала до встречи указателей и проверяем, что Х1-Х2-Хцентра == 0. Если на всех точках условие выполнялось, значит такая линия есть.
40kTons
31.10.2024 10:22Да, немного подумав над граничными случаями понял, что надо идти с концов. Сказано что симметричны должны быть точки не на прямой. Т.е. в исходном наборе не обязательно чётное количество. Может быть так, что исходно точек пять, симметричны две, а три лежат на прямой. В таком случае двигаться с концов удобнее
max_dark
31.10.2024 10:22Задачу вроде бы можно свести к задаче "является ли строка палиндромом?"
max_dark
31.10.2024 10:22struct Point { int x, y; } using Points = std::vector<Point>; Points sorted(Points p) { std::ranges::sort(p, [](const auto& a, const auto& b) { return a.x < b.x; }); return p; } bool is_palindrome(const Points& p) { if (p.size() >= 2) { size_t l = 0; size_t r = p.size() - 1; while (l < r) { if (p[l].y != p[r].y) return false; ++l; --r; } } return true; } bool solve(const Points& p) { return is_palindrome(sorted(p)); }
heartdevil
31.10.2024 10:22Вот, кстати, интересная тема. Мне понравилось ваше рассуждение. Я считаю, что именно так должен рассуждать кандидат на собесе. И вопрос в том, допустим, рассуждает кандидат хорошо, но код либо напишет плохо либо не сможет перенести мысль в код. Как тут быть тогда? Лично считаю, что кандидат, все-таки, "больше" прошел интервью, чем "не прошел". В контраст, кандидату, который, подумав, понял, что тут нужна сортировка + "два указателя", к примеру. Но вербально он не может объяснить и больше на интуицию полагается, чем на рассуждения "на подумать". Просто за завесой заучивания и нарешивания всех этих алгоритмических паттернов, сложно увидеть тех, кто реально будет думать над задачей, потому что такие кандидаты, могут не решить средненькую задачу, потому что они будут реально "думать" над ней, а не сканировать свои заготовки в голове.
40kTons
31.10.2024 10:22Лично считаю, что кандидат, все-таки, "больше" прошел интервью, чем "не прошел". В контраст, кандидату, который, подумав, понял, что тут нужна сортировка + "два указателя", к примеру.
Это значит, что контрастный кандидат либо знает конкретно эту задачу, либо прорешал достаточно много задач, что бы понять какой способ нужен для решения задачи. Данный кандидат не тратит время на рассуждения, поскольку при рассуждениях человек блуждает в мыслях и в конце приходит к решению. Но контрастный кандидат имеет навык, поэтому его блуждания минимальны.
Собеседующие хотят посмотреть на умение рассуждать, но опытный кандидат затрудняется в рассуждениях, поскольку он не мыслит словами. Он приходит к решению не через диалог и рассуждения, а как-то просто натренированная нейросетка быстро выдаёт ответ. Поэтому у собеседующих не получается посмотреть, как кандидат рассуждает. В то же время, если не решать эти задачи вообще, то есть большой риск не решить задачу в рамках отведённого времени, продемонстрировать незнание и провалить алгоритмическую секцию собеса.
Вы же когда пишите цикл по всем элементам массива не задумываетесь как писать цикл?
"Тут объявим переменную, а чему она равна, а равно 0 потому что с 0, тут должно быть условие, а что условие представляет собой, ну раз проходим по массиву, то условием будет пока не пройдём весь массив, значит надо длину указывать, тут увеличиваем переменную что бы она менялась, поскольку надо пройтись по всем элементам, то и увеличиваем на 1..."
В начале пути изучения программирования, у человека, который первый раз в жизни видит цикл, примерно такие мысли и будут. А у человека, который 100 раз циклы написал, написание не займёт умственных усилий и при написании будет думать над более важными вещами в своей задаче.
Как мне кажется, с одной стороны, такой скил "не думать и просто писать" ускоряет написание базовых вещей, с другой, в повседневной работе спрашиваемые на собесах алгоритмы у большинства людей не входят в каждодневную кодовую базу. Кажется, что умение быстро писать такие штуки полезно, но не ультимативно - нельзя сказать, что человек, который натренировал лучше того, который не натренирован, ведь это лишь один пазл и общей картины, а у другого человека картина может состоять из других вещей, которые в целом будут не хуже, чем у натренированного
Nelman86
31.10.2024 10:22Ко мне в телеграмм постучалась очень приветливая и милая девушка HR из Яндекса, с предложением о работе.
Недавно решил на несколько таких предложений откликнуться... По итогу сделал вывод, что таким способом предлагают всякий "неликвид" вакансий, где либо какой то треш на собеседовании, либо компания сама не знает кого она ищет - поиск ради поиска.
mysherocker
31.10.2024 10:22независимый эксперт, хотя я не поняла, в чем разница, кроме той, что он был визуально строг
Это не "независимый эксперт". Это проверяющий собеседующий. Задача про вертикальную ось симметрии как раз из небольшого набора задач, которые они дают.
Суть секции с ним -- поддерживание минимальной планки нанимаемых разработчиков (а не подъём средней, как устроено с институтом bar raiser в Amazon). Провал этой секции -- гарантированный провал всего собеседования, даже если все остальные секции прошли хорошо, покуда проверающий собеседующий имеет право вето.
А суровость его вида связана, вероятно, с тем, что они проводят собеседования куда чаще среднего разработчика и посему для них этот процесс куда менее увлекательный.
Несмотря на предыдущие скептические комментарии, я по своему опыту считаю, что работать в Яндексе хорошо, интересно и с годами компенсация может стать вполне внушительной, если понять, как устроена система мотивации.
И да, в Яндексе работают вполне адекватные люди, многие из которых не питают иллюзий по поводу оторванности от жизни литкод-собеседований. Все понимают, что они дают много ложноотрицательных срабатываний, приводящих к отказам достойным кандидатам. Особенно, если они не готовятся к собеседованию, хотя заранее хорошо известно, как эти собеседования проходят. Но это отдельная долгая тема, почему это так устроено во всех бигтехах.
dae-fromru
31.10.2024 10:22А потом на работе вы будете делать из этого... ничего, и самым сложным в работе так и останется собеседование.
PastorGL
31.10.2024 10:22Всегда было интересно, а какие у решений этих литкодовских задачек практические применения.
Я вот просто не могу себя заставить написать даже 1 строку кода без нормального объяснения, на кой именно чёрт он нужен в реальной жизни. Это не по-инженерному.
И в проде мне подобное за 25 лет встречалось ну может всего-то пару раз, а предметных областей и направлений деятельности я за это время перебрал целую кучу... Более того, писать чё-то такое с n-граммами / векторами / разбиениями с нуля такое вообще оказывалось не рационально, потому что есть готовые решения — и на крайняк код можно утырить оттуда, и подрихтовать как требуется.
mivlad
31.10.2024 10:22Ценность в возможности хотя бы даже предположить существование более эффективного решения, чем очевидный перебор вложенными циклами. А будет дальше этот код утырен, или же самостоятельно написан — уже не столь важно.
mysherocker
31.10.2024 10:22какие у решений этих литкодовских задачек практические применения
Какие альтернативы в компании на 10к+ раработчиков, с тысячами собеседующих и миллионами кандидатов? Где нужен конвеер и стандарт, чтобы компания не превратилась в набор несвязанных команд с рыночными отношениями.
Почему эти альтернативы не применяются в шести из семи крупнейших компаний по уровню капитализации (про нефтяников Saudi Aramco не скажу, но остальные компании списка -- Alphabet/Google, Nvidia, Apple, Microsoft, Meta/Facebook, Amazon), почему в них поголовно пишут литкод?
dvenum
31.10.2024 10:22Такое мнение можно найти про все, что требует усилий. Так уж устроен человек.
И вместе с тем, есть люди увлеченные, готовые чем-то заниматься уже только потому, что это интригует.
Позвольте под вашим комментарием разместить манифест о том, что учиться очень хорошо и полезно, это развивает мозг и формирует личность.
Возможно ли сконфигурировать прикладное решение, не прочитав ни одной книги и заработать на этом? Да, конечно. С ростом опыта еще и время эффективно потратив.
Так то эти задачки придумали для собеседований, чтобы как-то формализовать отбор, чтобы рекрутеры могли высокомерно рассуждать о квалификации кандидата, не утруждаясь значению слов. И вот конкретно в Яндекс задачи третьей секции выбирают откровенно глупые, наверное потому, что сложные не каждый интервьюер сможет. И эти интервьюеры еще наплевательски относятся к собеседованию: опоздал, ну да и ладно, зато неспеша начнем, как раз поболтать захотелось и есть идея про задачу (неправильная). Кроме молодых ребят, которые на первых двух этапах, те волнуются и серьезны, причем у них и задачи интереснее бывают, чем на "алгоритмической" секции.
Так вот, задачи глупые, а собеседования пафосный бардак.
Но алгоритмы это круто и алгоритмы это не пара трюков из однострочных задачек. Можно не учить и не знать, но не нужно таких специалистов смешивать в одном ряду, они из разных сфер. Кто-то уже все сделал, что можно использовать готовое? Так оно не само готовым сделалось.
К слову, для сотрудников того же Яндекс одно время читал лекции Максим Бабенко.
Enedwait
31.10.2024 10:22Из первой задачи:
if (s.length() < k) { return s.length(); }
И с чего это правильно?
Пусть k = 4, s = "aaa".
Тогда ответ: 1, а не 3.
Schalaeff
31.10.2024 10:22почему 1? возвращается длина строки, она равна 3?
Enedwait
31.10.2024 10:22По условию задачи:
Задача 1
Для заданной строки s и целого числа k вернуть длину самой длинной подстроки s, содержащей не более k различных символов.
Если строка s состоит из одного и того же символа, то длина самой длинной подстроки s, содержащей не более k различных символов = 1. Символ же один и тот же.
elmirius
31.10.2024 10:22Символ один и тот же, а требуется не более одного различного символа. Поэтому возвращаем длину строки.
heartdevil
31.10.2024 10:22Сколько вы видите различных символов в строке "aaa"? Ну и принцип Дирихле, если не ошибаюсь.
shurakaika
31.10.2024 10:22Мне кажется, или Яндекс потихоньку пытаются "отбелить"? Сколько было статей про многоступенчатые, аля Вавилонская башня, собеседования, алгоритмы, долгие согласования с разными людьми, а сейчас пошли статьи что-то в духе: "да не, не так уж там и страшно, там норм".
Причём недавно попадался ролик какой-то девочки HR из Яндекса, где она жаловалась, что нет java-разработчиков уровня middle; мол, пишите, все дела. Так может и не пишут, потому что куча собеседований + алгосики?
Автор, претензия не к вам. Просто наблюдения, что будто пытаются отбелить имидж компании)
PaulZi
31.10.2024 10:22Алгоритмические задачи, конечно, на бэкендера вообще не сдались. Они хороши для каких-нибудь мейнтейнеров ядра Линукс, разработчиков енкодеров всяких, в конце концов писателей софта под роверы на Марсе, но точно не бекедера. 99% работы бэкендера - это вытянуть правильно данные из базы, поработать над ними и положить обратно. И вот тут полно неучей которые не умеют запрашивать связи в ORM для избегания N+1 запросов, не умеющих составлять сложные запросы оптимально, да даже тупо индексы в таблице не могут правильно расставить.
Farongy
31.10.2024 10:22Да нормально выяснить, знает ли человек что нибудь про алгоритмы и их сложность. Только формат нужен другой. Написать руками за пол часа даже элементарный бинарный поиск на собеседовании будет сложно (а при учёте всяких граничных условий - невозможно), если человек специально не тренируется. А вот какой в этом смысл совсем не понятно. Думаю, если человек просто расскажет словами про сложность алгоритма и как его реализовать, этого будет вполне достаточно.
PikNic
31.10.2024 10:22Так-так, подождите, я вот системщик и постоянно ковыряю то ядро Linux, то U-Boot, то FreeBSD, зачем мне алгоритмические задачи то? Куда их впихивать при разработке драйверов?
eleoleeye
31.10.2024 10:22Я даже начал склоняться к мысли, что литкод интервью более "честные" что ли. Получил задачу - решил нет/да, показал рассуждения.
А то приходишь на интервью уровня сеньер и тебя как и 8 лет назад спрашивают одни и те же JAVA вопросы :
> связи в ORM для избегания N+1 запросов
> как работает хешмап
> что такое flyway ))
> и прочая полуджуновская, полуотсебятина от интервьюера которая явно дает понять, кто в это место может попасть и кто твои будущие коллеги
blind_oracle
31.10.2024 10:22Алгоритмы и структуры данных понимать нужно, но не в таком виде как на собеседованиях справшивают.
Есть вполне адекватные способы проверить понимает ли человек сложность того или иного алгоритма, будет ли он городить O(n^4) циклы и прочее без задрачивания его подстроками и прочим.
Также вполне можно понять понимает ли человек отличия хеш-таблицы, дерева, массива и т.п. В каких случаях использовать одно или другое. Просто поговорив и задав несколько вопросов, подискутировав об этих вещах - это сразу видно.
Куча народу просто отваливается на вопросах в духе "вот тебе нужно сделать кольцевой буфер обычный, какую структуру данных удобно использовать?". Начинают отвечать в духе "нууу, наверное хеш-таблица..."
emerald_isle
31.10.2024 10:22особенно потому, что рынок IT в 2023 очень нестандартный :-)
Поясните, что означает "нестандартный". А он когда-то был "стандартным"? Что бы это ни значило.
maxsmirnov92
31.10.2024 10:22По первой задаче решил набросать решение дабы проверить себя, не прибегая к каким-либо подсказкам, но в Android Studio. Так вот я оказался не молодец, которым должен быть согласно картинке выше, поскольку заняло у меня это больше часа. Потупив, после проб и ошибок с запуском под дебагом, я пришёл к решению, которое, справедливости ради, получилось более компактным по сравнению с тем, что в посте. Попутно также выяснилось, что немного изменённый код решает другую задачу. Пишу на Котлине.
Вот что вышло:
fun longestUniqueSubstring(s: String, k: Int): Int {
require(k >= 0)
var result = "" if (k > 0) { for (index in s.indices) { val set = mutableSetOf<Char>() for (i1 in 0..index) { val c = s[i1] for (i2 in 0..index) { if (c == s[i2]) {
set.add(c) } } } if (set.size <= k) { val subst = s.substring(0, index + 1) if (subst.length > result.length) { result = subst } } else { break } } } return result.length }
Если переформулировать задачу так:
Для заданной строки s и целого числа k вернуть длину самой длинной подстроки s, содержащей не более k одинаковых символов.
то решение может быть следующим (извняюсь за отсутствие форматирования, хабр не позволяет):
fun longestNotUniqueSubstring(s: String, k: Int): Int {
require(k >= 0)
var result = ""
if (k > 0) {
for (index in s.indices) {
val map = mutableMapOf<Char, Int>()
for (i1 in 0..index) {
val c = s[i1]
// количество вхождений символа c в текущую подстроку до index
var count = 0
for (i2 in 0..index) {
if (c == s[i2]) {
count++
}
}
map[c] = count
}
if (map.values.max() <= k) {
val subst = s.substring(0, index + 1)
if (subst.length > result.length) {
result = subst
}
} else {
break
}
}
}
return result.length
}
Таким образом, ни о каком написании решения по данной задаче в онлайне перед кем-то не идёт и речи (если только нет желания опозориться). Понятно, что это принципиально для того, чтобы устроиться в Яндекс (в котором я не могу и не хочу работать), но если смотреть в целом, насколько критичен невывоз подобного лайвкодинга в общем случае?
Keeper11
31.10.2024 10:22желание опозориться
принципиально для того, чтобы устроиться в Яндекс
Я подозревал...
maxsmirnov92
31.10.2024 10:22По задаче
Перенести нули в конец массива, сохранив порядок остальных элементов
Я бы сделал вот так (Котлин):
val result = mutableListOf<Int>()
val zeros = mutableListOf<Int>()
array.forEach {
if (it != 0) {
result.add(it)
} else {
zeros.add(it)
}
}
result.addAll(zeros)
return result.toIntArray()
Так нельзя или это чем-то плохое решение?
mysherocker
31.10.2024 10:22Плохое. Там в задаче ограничение -- O(1) по памяти. нельзя копировать исходный массив. Надо выполнить inplace операцию с входными данными.
ruslooob2
31.10.2024 10:22Неплохо покормили читателей хабра отборной пастой.
Буквально неделю назад проходил собес в Яндекс java-разработчиком. В конце второго этапа просто изчезли. Через несколько дней отписались, что я им не подхожу. Аргументировали, что им не хватило "чистоты кода и проверок на null". Моя просьба представить более развёрнутый фидбек ни к чему хорошему не привела. Я обе собеса прошёл почти идеально, решил все задачки, написал тесты, даже время ещё оставалось.
Сталкиваюсь с таким уже второй раз с их стороны. Кстати Тинькофф в этом плане тоже далеко не ушёл, но там хотя бы ближе к практике собеседования.
В общем, никому не советую проходить 5+ собеседований, только если вы не джун - олимпиадник, который не ценит себя.
solaris_n
Кто-то ещё в Яндекс идёт?
WLMike
Конечно. Согласно публичным отчетам рост численности работников за год около 30%
mostodont32
А ты какие компании на рынке РФ предлагаешь?
vanxant
sorry, мимо