Стажировки отменили? Диплом теперь будут проверять?
С 1 марта 2027 года в России меняются правила стажировок.
Теперь «стажировка в сфере труда» будет официально привязана к вашему образованию или полученной квалификации.
То есть стажироваться можно будет по профессии, специальности или направлению, которое вы осваиваете или уже освоили, либо по новой квалификации, которую получили через профессиональное обучение / переподготовку.
И ещё два новых ограничения:
➡️ договор о стажировке можно заключить не позднее года после соответствующего обучения
➡️ сама стажировка может длиться максимум 6 месяцев
Ничего непонятно? Сейчас объясним
Допустим, вы учитесь на лингвиста, экономиста или химика, но в последнее время думаете:
«Когда-нибудь попробую себя аналитиком».
Или сначала хотите сходить на стажировку в аналитику, потом попробовать ML, а потом решить, что вам вообще ближе.
Так вот, товарищи, с 2027 года рассчитывать на стажировку как на универсальный способ «просто попробовать любую профессию» станет сложнее. Для стажировки направление должно быть связано с вашим образованием или новой квалификацией.
Поэтому если вы давно хотели попробовать себя в аналитике, ML, backend или другом IT-направлении, рекомендуем использовать ближайшие отборы и стажировки, ибо в следующем году это будет сделать сложнее.
В этом вам помогут наши карьерные курсы СТАРТ и ПРО мы как раз готовим к стажировкам, упаковываем ваш опыт и даем конкретный план, как действовать с учетом новых правил.
➡️ Записаться
С 1 марта 2027 года в России меняются правила стажировок.
Теперь «стажировка в сфере труда» будет официально привязана к вашему образованию или полученной квалификации.
То есть стажироваться можно будет по профессии, специальности или направлению, которое вы осваиваете или уже освоили, либо по новой квалификации, которую получили через профессиональное обучение / переподготовку.
И ещё два новых ограничения:
Ничего непонятно? Сейчас объясним
Допустим, вы учитесь на лингвиста, экономиста или химика, но в последнее время думаете:
«Когда-нибудь попробую себя аналитиком».
Или сначала хотите сходить на стажировку в аналитику, потом попробовать ML, а потом решить, что вам вообще ближе.
Так вот, товарищи, с 2027 года рассчитывать на стажировку как на универсальный способ «просто попробовать любую профессию» станет сложнее. Для стажировки направление должно быть связано с вашим образованием или новой квалификацией.
Поэтому если вы давно хотели попробовать себя в аналитике, ML, backend или другом IT-направлении, рекомендуем использовать ближайшие отборы и стажировки, ибо в следующем году это будет сделать сложнее.
В этом вам помогут наши карьерные курсы СТАРТ и ПРО мы как раз готовим к стажировкам, упаковываем ваш опыт и даем конкретный план, как действовать с учетом новых правил.
Please open Telegram to view this post
VIEW IN TELEGRAM
👀18🗿5🔥2👏2😁1
Рынок пока жив, и мы это видим
Последнее время вокруг IT много разговоров, что рынок сдулся, вакансий нет, компании фризят найм.
Несмотря на всю ситуации, наших студентов приглашают на интервью, и они собирают офферы💰
Кто-то пришёл на СТАРТ летом, кто-то подключился к ПРО в сентябре. И сейчас мы уже видим результаты!
Почему у них получается? Потому что после курсов ребята выходят на рынок осознанно и готовыми ко всему пути до оффера. Этим и выигрывают на фоне тех, кто бездумно откликается, валит собесы и винит во всем рынок.
Как вас ведем до оффера:
➡️ Сначала закрываем техническую часть: теория, много практики, ДЗ и пет-проекты с проверкой, реальные задачи и вопросы с собеседований, подготовка к техническим секциям
➡️ Далее преподаватели помогают собрать карьерную стратегию: понять, куда подаваться, как упаковать опыт, оформить резюме и LinkedIn, писать сопроводительные и выстроить стратегию откликов так, чтобы повышать шанс попасть на собеседование
➡️ Отрабатываем на практике: mock-собеседования, где в условиях, приближенным к реальному собеседованию, вы проходите техническую секцию и мотивационную
К моменту выхода на рынок у вас уже собрана вся подготовка:
харды + проекты + резюме + упакованный опыт + стратегия откликов + навык проходить собеседования
Лучшим студентам мы помогаем с рефералками и рекомендуем их в компании.
А если вы прошли курсы, выполнили рекомендации, но оффер не получили — вернём деньги.
⭐ ЗАПИСАТЬСЯ НА КУРС⭐️
Последнее время вокруг IT много разговоров, что рынок сдулся, вакансий нет, компании фризят найм.
Несмотря на всю ситуации, наших студентов приглашают на интервью, и они собирают офферы
Кто-то пришёл на СТАРТ летом, кто-то подключился к ПРО в сентябре. И сейчас мы уже видим результаты!
Почему у них получается? Потому что после курсов ребята выходят на рынок осознанно и готовыми ко всему пути до оффера. Этим и выигрывают на фоне тех, кто бездумно откликается, валит собесы и винит во всем рынок.
Как вас ведем до оффера:
К моменту выхода на рынок у вас уже собрана вся подготовка:
харды + проекты + резюме + упакованный опыт + стратегия откликов + навык проходить собеседования
Лучшим студентам мы помогаем с рефералками и рекомендуем их в компании.
А если вы прошли курсы, выполнили рекомендации, но оффер не получили — вернём деньги.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Задача с собеседования в OYO
Дан целочисленный массив nums. Верните все тройки [nums[i], nums[j], nums[k]] такие, что i != j, i != k и j != k, а также nums[i] + nums[j] + nums[k] == 0.
Обратите внимание, что результирующий набор не должен содержать дублирующиеся тройки.
Пример 1:
Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
Explanation:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0.
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0.
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0.
Искомые тройки: [-1,0,1] и [-1,-1,2].
Обратите внимание, что порядок вывода и порядок троек не имеют значения.
Пример 2:
Input: nums = [0,1,1]
Output: []
Explanation: Сумма единственной возможной тройки не равна 0.
Пример 3:
Input: nums = [0,0,0]
Output: [[0,0,0]]
Explanation: Единственная возможная тройка даёт в сумме 0.
Ограничения:
3 <= nums.length <= 3000
-10⁵ <= nums[i] <= 10⁵
НАШ ЧАТ АЛГОРИТМИСТОВ
Решение
Для оптимального решения используем предварительную сортировку и метод двух указателей, движущихся навстречу друг другу.
После сортировки сумма будет монотонно зависеть от положения указателей: если сдвигаем l вправо - сумма не уменьшается (растёт или остаётся прежней из-за дубликатов), если сдвигаем r влево - сумма не увеличивается (уменьшается или остаётся прежней из-за дубликатов). Сортировка также упрощает обработку дубликатов, которые теперь стоят рядом.
Фиксируем первое число тройки как nums[i] и проходим переменной i по массиву nums.
Если nums[i] > 0: прерываем цикл, так как оставшиеся числа точно положительные.
Если i > 0 и nums[i] == nums[i - 1]: пропускаем текущую итерацию, так как встретили дубликат первого числа в тройке.
Инициализируем указатели:
l - указывает на эл-т, следующий за текущим i
r - указывает на последний эл-т массива
Пока l меньше r, двигаем указатели навстречу друг другу:
Вычисляем общую сумму тройки эл-в.
Если сумма больше 0:
- уменьшаем r.
Если сумма меньше 0:
- увеличиваем l.
Если сумма равна 0:
- добавляем эту тройку в res;
- сдвигаем l вправо и пропускаем дубликаты nums[l], если они есть, сдвигая l ещё раз вправо.
Возвращаем res, содержащий все уникальные тройки, сумма которых равна 0.
Сложность
O(n^2) - по времени (сортировка - O(n log n); внешний цикл - O(n), на каждой итерации i - проход двумя указателями в цикле while за O(n). Итого: O(n^2))
O(1) - по памяти (храним некоторое кол-во переменных; без учёта сортировки)
Код
class Solution:
def threeSum(self, nums: list[int]) -> list[list[int]]:
nums.sort()
res = []
for i in range(len(nums)):
if nums[i] > 0:
break
if i > 0 and nums[i] == nums[i - 1]:
continue
l, r = i + 1, len(nums) - 1
while l < r:
three_sum = nums[i] + nums[l] + nums[r]
if three_sum > 0:
r -= 1
elif three_sum < 0:
l += 1
else:
res.append([nums[i], nums[l], nums[r]])
l += 1
while l < r and nums[l] == nums[l - 1]:
l += 1
return res
@algoses
Дан целочисленный массив nums. Верните все тройки [nums[i], nums[j], nums[k]] такие, что i != j, i != k и j != k, а также nums[i] + nums[j] + nums[k] == 0.
Обратите внимание, что результирующий набор не должен содержать дублирующиеся тройки.
Пример 1:
Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
Explanation:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0.
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0.
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0.
Искомые тройки: [-1,0,1] и [-1,-1,2].
Обратите внимание, что порядок вывода и порядок троек не имеют значения.
Пример 2:
Input: nums = [0,1,1]
Output: []
Explanation: Сумма единственной возможной тройки не равна 0.
Пример 3:
Input: nums = [0,0,0]
Output: [[0,0,0]]
Explanation: Единственная возможная тройка даёт в сумме 0.
Ограничения:
3 <= nums.length <= 3000
-10⁵ <= nums[i] <= 10⁵
НАШ ЧАТ АЛГОРИТМИСТОВ
Решение
После сортировки сумма будет монотонно зависеть от положения указателей: если сдвигаем l вправо - сумма не уменьшается (растёт или остаётся прежней из-за дубликатов), если сдвигаем r влево - сумма не увеличивается (уменьшается или остаётся прежней из-за дубликатов). Сортировка также упрощает обработку дубликатов, которые теперь стоят рядом.
Фиксируем первое число тройки как nums[i] и проходим переменной i по массиву nums.
Если nums[i] > 0: прерываем цикл, так как оставшиеся числа точно положительные.
Если i > 0 и nums[i] == nums[i - 1]: пропускаем текущую итерацию, так как встретили дубликат первого числа в тройке.
Инициализируем указатели:
l - указывает на эл-т, следующий за текущим i
r - указывает на последний эл-т массива
Пока l меньше r, двигаем указатели навстречу друг другу:
Вычисляем общую сумму тройки эл-в.
Если сумма больше 0:
- уменьшаем r.
Если сумма меньше 0:
- увеличиваем l.
Если сумма равна 0:
- добавляем эту тройку в res;
- сдвигаем l вправо и пропускаем дубликаты nums[l], если они есть, сдвигая l ещё раз вправо.
Возвращаем res, содержащий все уникальные тройки, сумма которых равна 0.
Сложность
O(1) - по памяти (храним некоторое кол-во переменных; без учёта сортировки)
Код
def threeSum(self, nums: list[int]) -> list[list[int]]:
nums.sort()
res = []
for i in range(len(nums)):
if nums[i] > 0:
break
if i > 0 and nums[i] == nums[i - 1]:
continue
l, r = i + 1, len(nums) - 1
while l < r:
three_sum = nums[i] + nums[l] + nums[r]
if three_sum > 0:
r -= 1
elif three_sum < 0:
l += 1
else:
res.append([nums[i], nums[l], nums[r]])
l += 1
while l < r and nums[l] == nums[l - 1]:
l += 1
return res
@algoses
❤2
Стажировка в BigTech или ШАД? Будь готов, что спросят про LLM.
На собесах в ML всё чаще говорят про агентов, RAG и свежие модели. Пока ты решаешь матан, индустрия уже ушла туда.
Каждый день разбираем коротко, с кодом и ссылками на статьи. Чтобы на собесе было что рассказать.
🎁 А для своих собрали папку для подготовки-: матан, бесплатные книги по ИИ и стажировки.
Читай до собеса, а не после: t.me/data_analysis_ml
На собесах в ML всё чаще говорят про агентов, RAG и свежие модели. Пока ты решаешь матан, индустрия уже ушла туда.
Каждый день разбираем коротко, с кодом и ссылками на статьи. Чтобы на собесе было что рассказать.
🎁 А для своих собрали папку для подготовки-: матан, бесплатные книги по ИИ и стажировки.
Читай до собеса, а не после: t.me/data_analysis_ml
❤4👍2🔥2
Задача с собеседования в eBay
Дана строка s, проверьте, можно ли составить её, взяв какую-либо её подстроку и повторив её два или более раз подряд.
Пример 1:
Input: s = "abab"
Output: true
Explanation: Это подстрока "ab", повторяющаяся дважды.
Пример 2:
Input: s = "aba"
Output: false
Пример 3:
Input: s = "abcabcabcabc"
Output: true
Explanation: Это подстрока "abc", повторяющаяся четыре раза, или подстрока "abcabc", повторяющаяся дважды.
Ограничения:
1 <= s.length <= 10⁴
s состоит из строчных английских букв.
НАШ ЧАТ АЛГОРИТМИСТОВ
Решение
Если s состоит из повторяющихся подстрок, то у неё есть длинный собственный префикс, равный её суффиксу.
Классический метод решения задачи - префикс-функция из алгоритма Кнута-Морриса-Пратта.
Префикс-функция даёт длины наибольших бордеров для всех префиксов.
Бордер - собственный префикс строки, являющийся одновременно её суффиксом. Необходимо проверить, образует ли бордер период всей строки.
Создаем массив lps (longest prefix-suffix), где lps[i] хранит длину наибольшего собственного префикса подстроки s[0..i], который одновременно является её суффиксом.
Если при вычислении префикс-функции символы не совпадают, длина префикса (k) не сбрасывается в ноль, а "откатывается" к уже вычисленному значению для более короткого префикса.
Идём по строке слева направо, храня k - длину текущего совпавшего префикса:
Пока k > 0 (префикс непустой) и s[i] != s[k] (символы не совпали):
- "откатываемся" к наибольшему валидному бордеру меньшей длины: k = lps[k - 1] (если префикс s[0..k-1] равен суффиксу s[i-k..i-1], то любой бордер строки s[0..k-1] также является бордером и для s[0..i-1]. Наибольший такой бордер имеет длину lps[k - 1]).
Если s[i] == s[k]:
- продлеваем совпавший префикс текущим символом (k += 1).
Записываем результат: lps[i] = k.
Разберем на примере 1, где s = "abab":
- Подстрока "a" (i = 0): собственных префиксов нет => lps[0] = 0.
- Подстрока "ab" (i = 1): префикс "a" != суффикс "b" => lps[1] = 0.
- Подстрока "aba" (i = 2): префикс "a" == суффикс "a" => lps[2] = 1.
- Подстрока "abab" (i = 3): префикс "ab" == суффикс "ab" => lps[3] = 2.
Получившийся массив lps: [0, 0, 1, 2]
L (длина бордера всей строки) = lps[n - 1]. Если L > 0, то префикс длины L совпадает с суффиксом длины L: s[0..L-1] == s[n-L..n-1].
Суффикс начинается с индекса n - L, т.е. для любого индекса j от 0 до L-1 будет выполняться s[j] == s[j + (n - L)]. Таким образом, строка сдвигается сама на себя с шагом p = n - L.
p - кандидат на длину минимального периода.
Чтобы строка состояла из точных повторов этого периода, должны выполняться следующие два условия:
- L > 0 (иначе p = n и n % n == 0 даст true для любой строки, к примеру, "abcd")
- n % p == 0 (общая длина строки должна нацело делиться на длину периода. К примеру, для "ababa", где n = 5, L = 3, p = 2 и 5 % 2 != 0).
Сложность
O(n) - по времени (k увеличивается не более чем на 1 за каждую итерацию внешнего цикла for, в цикле while - k только уменьшается. Таким образом, суммарное число итераций while не превышает n)
O(n) - по памяти (строим массив lps)
Код
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
n = len(s)
lps = [0] * n
for i in range(1, n):
k = lps[i - 1]
while k > 0 and s[i] != s[k]:
k = lps[k - 1]
if s[i] == s[k]:
k += 1
lps[i] = k
L = lps[n - 1]
p = n - L
return L > 0 and n % p == 0
@algoses
Дана строка s, проверьте, можно ли составить её, взяв какую-либо её подстроку и повторив её два или более раз подряд.
Пример 1:
Input: s = "abab"
Output: true
Explanation: Это подстрока "ab", повторяющаяся дважды.
Пример 2:
Input: s = "aba"
Output: false
Пример 3:
Input: s = "abcabcabcabc"
Output: true
Explanation: Это подстрока "abc", повторяющаяся четыре раза, или подстрока "abcabc", повторяющаяся дважды.
Ограничения:
1 <= s.length <= 10⁴
s состоит из строчных английских букв.
НАШ ЧАТ АЛГОРИТМИСТОВ
Решение
Классический метод решения задачи - префикс-функция из алгоритма Кнута-Морриса-Пратта.
Префикс-функция даёт длины наибольших бордеров для всех префиксов.
Бордер - собственный префикс строки, являющийся одновременно её суффиксом. Необходимо проверить, образует ли бордер период всей строки.
Создаем массив lps (longest prefix-suffix), где lps[i] хранит длину наибольшего собственного префикса подстроки s[0..i], который одновременно является её суффиксом.
Если при вычислении префикс-функции символы не совпадают, длина префикса (k) не сбрасывается в ноль, а "откатывается" к уже вычисленному значению для более короткого префикса.
Идём по строке слева направо, храня k - длину текущего совпавшего префикса:
Пока k > 0 (префикс непустой) и s[i] != s[k] (символы не совпали):
- "откатываемся" к наибольшему валидному бордеру меньшей длины: k = lps[k - 1] (если префикс s[0..k-1] равен суффиксу s[i-k..i-1], то любой бордер строки s[0..k-1] также является бордером и для s[0..i-1]. Наибольший такой бордер имеет длину lps[k - 1]).
Если s[i] == s[k]:
- продлеваем совпавший префикс текущим символом (k += 1).
Записываем результат: lps[i] = k.
Разберем на примере 1, где s = "abab":
- Подстрока "a" (i = 0): собственных префиксов нет => lps[0] = 0.
- Подстрока "ab" (i = 1): префикс "a" != суффикс "b" => lps[1] = 0.
- Подстрока "aba" (i = 2): префикс "a" == суффикс "a" => lps[2] = 1.
- Подстрока "abab" (i = 3): префикс "ab" == суффикс "ab" => lps[3] = 2.
Получившийся массив lps: [0, 0, 1, 2]
L (длина бордера всей строки) = lps[n - 1]. Если L > 0, то префикс длины L совпадает с суффиксом длины L: s[0..L-1] == s[n-L..n-1].
Суффикс начинается с индекса n - L, т.е. для любого индекса j от 0 до L-1 будет выполняться s[j] == s[j + (n - L)]. Таким образом, строка сдвигается сама на себя с шагом p = n - L.
p - кандидат на длину минимального периода.
Чтобы строка состояла из точных повторов этого периода, должны выполняться следующие два условия:
- L > 0 (иначе p = n и n % n == 0 даст true для любой строки, к примеру, "abcd")
- n % p == 0 (общая длина строки должна нацело делиться на длину периода. К примеру, для "ababa", где n = 5, L = 3, p = 2 и 5 % 2 != 0).
Сложность
O(n) - по памяти (строим массив lps)
Код
def repeatedSubstringPattern(self, s: str) -> bool:
n = len(s)
lps = [0] * n
for i in range(1, n):
k = lps[i - 1]
while k > 0 and s[i] != s[k]:
k = lps[k - 1]
if s[i] == s[k]:
k += 1
lps[i] = k
L = lps[n - 1]
p = n - L
return L > 0 and n % p == 0
@algoses
❤4
Как школьнику попасть в IT ещё до университета
Стартовала регистрация на Всероссийскую олимпиаду по программированию «Технокубок», организованную МФТИ, МГТУ имени Н. Э. Баумана и компанией VK. В этом году к школьникам 8–11 классов впервые присоединились студенты колледжей.
Олимпиада — это не только возможность проверить свои навыки, но и способ заработать бонусы при поступлении. У «Технокубка» первый уровень в перечне РСОШ, поэтому победители и призёры могут поступить в вуз без вступительных испытаний или получить 100 баллов за ЕГЭ по информатике. Диплом действует четыре года.
Задания олимпиады связаны с алгоритмами и структурами данных. Решать их можно на разных языках программирования — от Python и C++ до JavaScript и Kotlin. Кроме стандартных задач, будут специальные задания от команд VK с дополнительными призами.
Отборочные онлайн-этапы пройдут 8 ноября и 6 декабря, очный отбор — 30 января, финал в Москве — 12–14 марта. Регистрация открыта до 6 декабря на платформе All Cups.
Помимо подарков от организаторов, победителей ждут персональные профориентационные консультации с экспертами VK. Участие в олимпиаде — возможность не только побороться за поступление в технический вуз, но и познакомиться с реальными задачами из мира разработки.
Стартовала регистрация на Всероссийскую олимпиаду по программированию «Технокубок», организованную МФТИ, МГТУ имени Н. Э. Баумана и компанией VK. В этом году к школьникам 8–11 классов впервые присоединились студенты колледжей.
Олимпиада — это не только возможность проверить свои навыки, но и способ заработать бонусы при поступлении. У «Технокубка» первый уровень в перечне РСОШ, поэтому победители и призёры могут поступить в вуз без вступительных испытаний или получить 100 баллов за ЕГЭ по информатике. Диплом действует четыре года.
Задания олимпиады связаны с алгоритмами и структурами данных. Решать их можно на разных языках программирования — от Python и C++ до JavaScript и Kotlin. Кроме стандартных задач, будут специальные задания от команд VK с дополнительными призами.
Отборочные онлайн-этапы пройдут 8 ноября и 6 декабря, очный отбор — 30 января, финал в Москве — 12–14 марта. Регистрация открыта до 6 декабря на платформе All Cups.
Помимо подарков от организаторов, победителей ждут персональные профориентационные консультации с экспертами VK. Участие в олимпиаде — возможность не только побороться за поступление в технический вуз, но и познакомиться с реальными задачами из мира разработки.
В IT всегда есть что изучить. Найти бы на всё время.
Python, фронтенд, нейросети, бэкенд — хочется разобраться во всём, но лучше начать с того, что интересно именно вам.
Собрали каналы по разным IT-направлениям, чтобы было проще выбрать:
👉 Журнал об IT
🖥 Фронтенд разработка
🖥 Data Science | Machinelearning
🖥 Node js | Backend
👩💻 Вёрстка
🖥 Python | Backend
🖥 QA
Уже работаете в IT? Загляните в своё направление.
Присматриваетесь к профессии? Посмотрите, что вам ближе.
Выберите канал и подписывайтесь.
Python, фронтенд, нейросети, бэкенд — хочется разобраться во всём, но лучше начать с того, что интересно именно вам.
Собрали каналы по разным IT-направлениям, чтобы было проще выбрать:
Уже работаете в IT? Загляните в своё направление.
Присматриваетесь к профессии? Посмотрите, что вам ближе.
Выберите канал и подписывайтесь.
Please open Telegram to view this post
VIEW IN TELEGRAM
Полный цикл отбора в Касперский (Бэкенд)
От выпускника нашего курса "Бэкенд Про". Там же уже выложен разбор направлений GO, Pythonнабора на стажировку Касперского Safeboard.
➡️ Записаться
Вступительный тест
Подавался на бэкенд С++, тест был на платформе типа stepik, включал пару десятков вопросов типа тестовых и пару задач контестного типа, в которых требуется написать код. Были вопросы по языку и общим техническим темам (сети, общие практики разработки, Linux). Задачи несложные, просто знания алгоритмов и языка, но были случаи вида "исправьте уязвимости в данном коде".
После прохождения пришло письмо с тестовым и видеоинтервью.
Тестовое задание
Разработка аналогов популярных и не очень утилит Unix или утилит в их стиле. Примеры здесь. В моём случае это был частный случай утилиты
Видеоинтервью
Нужно было записать ответы на десяток вопросов по 2-3 минуты в среднем. Вопросы были как из разряда "какой свой проект вы считаете самым интересным и почему", так и глубоко техническими вроде продвинутых механизмов языка, принципов работы операционных систем или, например, сетевых протоколов. Примеры здесь.
Приходит рекрутер с обратной связью. Говорит, что прошёл на следующий этап и назначает собеседование на 1 час с каждой заинтересованной во мне командой.
Собеседование
Обсуждали как мотивацию и опыт, так и технические темы. Были вопросы на более-менее математические темы вроде свойств хеш-функций, средства языка и устройство вычислительных системы (osdev и немного о железе).
Задача 1: корректным образом посчитать ненулевые биты в
Задача 2: развернуть строку на языке C.
Задача 3: развернуть строку по словам (то есть условно "один два три" переходит в "три два один").
Все задачи нетрудные и постоянно разбираются здесь.
Рекрутер пришел с оффером.
Подписаться: @codeof_art
От выпускника нашего курса "Бэкенд Про". Там же уже выложен разбор направлений GO, Pythonнабора на стажировку Касперского Safeboard.
Вступительный тест
Подавался на бэкенд С++, тест был на платформе типа stepik, включал пару десятков вопросов типа тестовых и пару задач контестного типа, в которых требуется написать код. Были вопросы по языку и общим техническим темам (сети, общие практики разработки, Linux). Задачи несложные, просто знания алгоритмов и языка, но были случаи вида "исправьте уязвимости в данном коде".
После прохождения пришло письмо с тестовым и видеоинтервью.
Тестовое задание
Разработка аналогов популярных и не очень утилит Unix или утилит в их стиле. Примеры здесь. В моём случае это был частный случай утилиты
find с поддержкой рекурсивного поиска и регулярных выражений. Как я понял не нужно пытаться написать код "на максималках", но документация с тем же Doxygen, тесты и нормальная инфра вокруг решения будут плюсом.Видеоинтервью
Нужно было записать ответы на десяток вопросов по 2-3 минуты в среднем. Вопросы были как из разряда "какой свой проект вы считаете самым интересным и почему", так и глубоко техническими вроде продвинутых механизмов языка, принципов работы операционных систем или, например, сетевых протоколов. Примеры здесь.
Приходит рекрутер с обратной связью. Говорит, что прошёл на следующий этап и назначает собеседование на 1 час с каждой заинтересованной во мне командой.
Собеседование
Обсуждали как мотивацию и опыт, так и технические темы. Были вопросы на более-менее математические темы вроде свойств хеш-функций, средства языка и устройство вычислительных системы (osdev и немного о железе).
Задача 1: корректным образом посчитать ненулевые биты в
int с учётом отрицательных чисел и переносимости.Задача 2: развернуть строку на языке C.
Задача 3: развернуть строку по словам (то есть условно "один два три" переходит в "три два один").
Все задачи нетрудные и постоянно разбираются здесь.
Рекрутер пришел с оффером.
Подписаться: @codeof_art
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤1
Задача с собеседования в ZScaler
Дан целочисленный массив nums, индексированный с 0. Пара целых чисел x и y называется сильной парой, если она удовлетворяет следующему условию:
|x - y| <= min(x, y)
Вам необходимо выбрать два целых числа из массива nums так, чтобы они формировали сильную пару, а их побитовый XOR был максимальным среди всех сильных пар в этом массиве.
Верните максимальное значение XOR среди всех возможных сильных пар в nums.
Обратите внимание, что для формирования пары вы можете выбрать одно и то же целое число дважды.
Пример 1:
Input: nums = [1,2,3,4,5]
Output: 7
Explanation: В nums есть 11 сильных пар: (1, 1), (1, 2), (2, 2), (2, 3), (2, 4), (3, 3), (3, 4), (3, 5), (4, 4), (4, 5) и (5, 5).
Максимальный XOR, который можно получить из этих пар, - это 3 XOR 4 = 7.
Пример 2:
Input: nums = [10,100]
Output: 0
Explanation: В nums есть 2 сильные пары: (10, 10) и (100, 100).
Максимальный XOR, который можно получить из пар, - это 10 XOR 10 = 0, так как пара (100, 100) также даёт 100 XOR 100 = 0.
Пример 3:
Input: nums = [5,6,25,30]
Output: 7
Explanation: В nums есть 6 сильных пар: (5, 5), (5, 6), (6, 6), (25, 25), (25, 30) и (30, 30).
Максимальный XOR, который можно получить из пар, - это 25 XOR 30 = 7, так как единственное другое ненулевое значение XOR равно 5 XOR 6 = 3.
Ограничения:
1 <= nums.length <= 50
1 <= nums[i] <= 100
НАШ ЧАТ АЛГОРИТМИСТОВ
Решение
Итак, у нас есть условие формирования сильной пары: |x - y| <= min(x, y). Относительно x и y условие симметрично, мы можем поменять их местами, и |x - y| не изменится, так же, как и min(x, y). Получается, для проверки пары нет разницы, в каком порядке брать числа.
Однако, для упрощения выражения будет удобнее, если обозначим, какое число меньше, а какое больше.
Допустим, x - меньшее число, а y - большее. Следовательно:
min(x, y) = x
|x - y| = y - x
Если отсортировать массив, то для x и y выполняется x <= y (где i < j, x = nums[i], y = nums[j] и nums[i] <= nums[j]).
Таким образом, |x - y| <= min(x, y) =>
y - x <= x =>
y <= 2x
Условие сильной пары: большее число не более чем в два раза превышает меньшее.
Для решения оптимально использовать алгоритм "скользящего окна" с двумя указателями:
Если зафиксировать больший (правый, nums[right]) эл-т в отсортированном массиве, то для формирования сильной пары необходимо найти все nums[i] слева от него, для которых nums[right] <= 2 * nums[i].
Учитывая, что массив отсортирован, при движении влево - nums[i] уменьшается. => Если nums[right] <= 2 * nums[left], то для любого k в диапазоне [left, right] будет выполняться nums[right] <= 2 * nums[k]. Этот диапазон [left, right] - и есть окно.
left движется только вперёд, так как при возрастании right порог 2 * nums[left] растёт.
Ограничения в задаче маленькие, поэтому можно обойтись без оптимизации перебора внутри окна.
Алгоритм:
Сортируем массив nums.
Переменные:
res - текущий максимальный XOR среди сильных пар.
left - левая граница окна.
Двигаем правый указатель right по массиву:
Пока условие сильной пары нарушается - nums[right] > 2 * nums[left]:
- сдвигаем left вправо, сужая окно, пока nums[right] не образует валидную пару с nums[left].
После того, как все эл-ты в диапазоне [left, right] формируют сильные пары с nums[right], перебираем эл-ты [left, right]:
- обновляем максимальный res (res = max(res, nums[i] ^ nums[right])).
Возвращаем res с максимальным значением XOR среди всех сильных пар.
Сложность
O(n^2) - по времени (в худшем случае, когда все эл-ты равны, внутренний цикл: окно не сужается, для каждого right перебираются все left <= right; в лучшем случае - O(n log n) - сортировка)
O(1) - по памяти (храним переменные; без учёта сортировки)
Код
class Solution:
def maximumStrongPairXor(self, nums: List[int]) -> int:
nums.sort()
res = 0
left = 0
for right in range(len(nums)):
while nums[right] > 2 * nums[left]:
left += 1
for i in range(left, right + 1):
res = max(res, nums[i] ^ nums[right])
return res
@algoses
Дан целочисленный массив nums, индексированный с 0. Пара целых чисел x и y называется сильной парой, если она удовлетворяет следующему условию:
|x - y| <= min(x, y)
Вам необходимо выбрать два целых числа из массива nums так, чтобы они формировали сильную пару, а их побитовый XOR был максимальным среди всех сильных пар в этом массиве.
Верните максимальное значение XOR среди всех возможных сильных пар в nums.
Обратите внимание, что для формирования пары вы можете выбрать одно и то же целое число дважды.
Пример 1:
Input: nums = [1,2,3,4,5]
Output: 7
Explanation: В nums есть 11 сильных пар: (1, 1), (1, 2), (2, 2), (2, 3), (2, 4), (3, 3), (3, 4), (3, 5), (4, 4), (4, 5) и (5, 5).
Максимальный XOR, который можно получить из этих пар, - это 3 XOR 4 = 7.
Пример 2:
Input: nums = [10,100]
Output: 0
Explanation: В nums есть 2 сильные пары: (10, 10) и (100, 100).
Максимальный XOR, который можно получить из пар, - это 10 XOR 10 = 0, так как пара (100, 100) также даёт 100 XOR 100 = 0.
Пример 3:
Input: nums = [5,6,25,30]
Output: 7
Explanation: В nums есть 6 сильных пар: (5, 5), (5, 6), (6, 6), (25, 25), (25, 30) и (30, 30).
Максимальный XOR, который можно получить из пар, - это 25 XOR 30 = 7, так как единственное другое ненулевое значение XOR равно 5 XOR 6 = 3.
Ограничения:
1 <= nums.length <= 50
1 <= nums[i] <= 100
НАШ ЧАТ АЛГОРИТМИСТОВ
Решение
Однако, для упрощения выражения будет удобнее, если обозначим, какое число меньше, а какое больше.
Допустим, x - меньшее число, а y - большее. Следовательно:
min(x, y) = x
|x - y| = y - x
Если отсортировать массив, то для x и y выполняется x <= y (где i < j, x = nums[i], y = nums[j] и nums[i] <= nums[j]).
Таким образом, |x - y| <= min(x, y) =>
y - x <= x =>
y <= 2x
Условие сильной пары: большее число не более чем в два раза превышает меньшее.
Для решения оптимально использовать алгоритм "скользящего окна" с двумя указателями:
Если зафиксировать больший (правый, nums[right]) эл-т в отсортированном массиве, то для формирования сильной пары необходимо найти все nums[i] слева от него, для которых nums[right] <= 2 * nums[i].
Учитывая, что массив отсортирован, при движении влево - nums[i] уменьшается. => Если nums[right] <= 2 * nums[left], то для любого k в диапазоне [left, right] будет выполняться nums[right] <= 2 * nums[k]. Этот диапазон [left, right] - и есть окно.
left движется только вперёд, так как при возрастании right порог 2 * nums[left] растёт.
Ограничения в задаче маленькие, поэтому можно обойтись без оптимизации перебора внутри окна.
Алгоритм:
Сортируем массив nums.
Переменные:
res - текущий максимальный XOR среди сильных пар.
left - левая граница окна.
Двигаем правый указатель right по массиву:
Пока условие сильной пары нарушается - nums[right] > 2 * nums[left]:
- сдвигаем left вправо, сужая окно, пока nums[right] не образует валидную пару с nums[left].
После того, как все эл-ты в диапазоне [left, right] формируют сильные пары с nums[right], перебираем эл-ты [left, right]:
- обновляем максимальный res (res = max(res, nums[i] ^ nums[right])).
Возвращаем res с максимальным значением XOR среди всех сильных пар.
Сложность
O(1) - по памяти (храним переменные; без учёта сортировки)
Код
def maximumStrongPairXor(self, nums: List[int]) -> int:
nums.sort()
res = 0
left = 0
for right in range(len(nums)):
while nums[right] > 2 * nums[left]:
left += 1
for i in range(left, right + 1):
res = max(res, nums[i] ^ nums[right])
return res
@algoses
❤2🔥2
Стажировка в Касперский (Safeboard)
Публикуем честный отзыв из нашего чата. В конце концов, мы будем помнить не слова наших врагов, а молчание наших друзей.
🔥 Разбор направления GO, Python, Системной аналитики уже выложены только на нашем курсе Бэкенд ПРО.
➡️ Записаться
Извиняюсь за длину сообщения.
Проходил недавно отбор на стажировку в Касперском, С++.
Прошел все этапы, на техническом собеседовании после тестового задания очень хвалили за тестовое.
После этого было три финала.
На первом у интервьюера была анкета с кривыми данными обо мне: написано, что английский А1, хотя в моем резюме стоит С1. Узнал об этом, когда он поинтересовался, как же я код собираюсь писать, если не знаю английский. Объяснил ему, что это ошибка, и попросил рекрутера исправить это. В остальном, прошло очень хорошо, собеседующий хвалил, что я знаю вещи, «которые не обязательны для стажера»
На втором всё просто было хорошо. Сказали, что ответ уже есть, но предадут через рекрутера (так делают, когда ответ — «нет»?)
На третье, как мне объяснили, не пришел лид. Из-за этого у его коллеги, который меня собесил, вообще не было информации обо мне. Я предложил скинуть ему резюме — он отказался, ссылаясь на политику обязательного общения через кадровика. Несмотря на это, общались 1,5 часа, вместо получасового регламента. Около получаса беседовали о том, как бы я проектировал многопользовательское приложение — не думал, что такое спрашивают на стажку, но многие мои решения были одобрены.
Дальше было то, что побудило меня написать эту пасту.
На протяжении полутора недель после последнего финала рекрутер не читал мои сообщения вовсе, хотя до этого они читались в течении минуты. Писал на почту стажировки — без толку. С горем пополам нашел в телеге аккаунт поддержки, который на сайте нигде не указан — написал, они пообещали разобраться, рекрутер действительно ответила этим же вечером.
Ответ: «По итогам интервью эксперты отметили, что у вас есть хорошие базовые знания и понимание технологий, однако не хватает опыта работы и уверенности в реализации собственных решений».
Опыта работы для стажировки? С учетом того, что опыт работы не нулевой, в резюме — полгода. После такого отношения кадровиков и ответа руки слегка опускаются.
P. S. В общем инцидент был донесен до сведения руководителей стажировки, пообещали быть более внимательными и наладить процессы.
Подписаться: @chad_protocol
Публикуем честный отзыв из нашего чата. В конце концов, мы будем помнить не слова наших врагов, а молчание наших друзей.
Извиняюсь за длину сообщения.
Проходил недавно отбор на стажировку в Касперском, С++.
Прошел все этапы, на техническом собеседовании после тестового задания очень хвалили за тестовое.
После этого было три финала.
На первом у интервьюера была анкета с кривыми данными обо мне: написано, что английский А1, хотя в моем резюме стоит С1. Узнал об этом, когда он поинтересовался, как же я код собираюсь писать, если не знаю английский. Объяснил ему, что это ошибка, и попросил рекрутера исправить это. В остальном, прошло очень хорошо, собеседующий хвалил, что я знаю вещи, «которые не обязательны для стажера»
На втором всё просто было хорошо. Сказали, что ответ уже есть, но предадут через рекрутера (так делают, когда ответ — «нет»?)
На третье, как мне объяснили, не пришел лид. Из-за этого у его коллеги, который меня собесил, вообще не было информации обо мне. Я предложил скинуть ему резюме — он отказался, ссылаясь на политику обязательного общения через кадровика. Несмотря на это, общались 1,5 часа, вместо получасового регламента. Около получаса беседовали о том, как бы я проектировал многопользовательское приложение — не думал, что такое спрашивают на стажку, но многие мои решения были одобрены.
Дальше было то, что побудило меня написать эту пасту.
На протяжении полутора недель после последнего финала рекрутер не читал мои сообщения вовсе, хотя до этого они читались в течении минуты. Писал на почту стажировки — без толку. С горем пополам нашел в телеге аккаунт поддержки, который на сайте нигде не указан — написал, они пообещали разобраться, рекрутер действительно ответила этим же вечером.
Ответ: «По итогам интервью эксперты отметили, что у вас есть хорошие базовые знания и понимание технологий, однако не хватает опыта работы и уверенности в реализации собственных решений».
Опыта работы для стажировки? С учетом того, что опыт работы не нулевой, в резюме — полгода. После такого отношения кадровиков и ответа руки слегка опускаются.
P. S. В общем инцидент был донесен до сведения руководителей стажировки, пообещали быть более внимательными и наладить процессы.
Подписаться: @chad_protocol
Please open Telegram to view this post
VIEW IN TELEGRAM
🗿21🔥2
Forwarded from Поступашки - ШАД, Стажировки и Магистратура
Ты станешь специалистом, которого не заменит ИИ
Написать код, запустить модель или посчитать A/B-тест теперь может ИИ. Поэтому одного умения пользоваться инструментами уже мало.
Компаниям нужен человек, который понимает, какую задачу решает, может выбрать подход, заметить ошибку и довести дело до результата. Рутину поручат ИИ. Тебе доверят то, где нужно думать самому и отвечать за решение — за это и будут платить.
Именно эти навыки мы и прокачаем на курсах:
➡️ Deep Learning
➡️ ML System Design
➡️ A/B-тесты
➡️ Soft Skills для IT
➡️ Time Series
➡️ SQL и базы данных
➡️ Reinforcement Learning
Можно взять один курс или комбо по спеццене. А если не получишь оффер - вернем деньги!
Курсы для тебя, если ты:
❗️ Много практики и личный куратор
Все знания закрепляются на реальных задачах с собесов и рабочих кейсах. Для портфолио создаём пет-проекты, а в конце курса проводим мок-интервью, чтобы ты увереннее проходил реальные собесы. По любым вопросам на связи куратор и преподаватель.
В программу всех курсов войдет:
🔵 закрытый банк собесов и тестовых Яндекса, Т-Банка, Ozon, WB, Авито и других компаний;
🔵 разборы стажировки в X5, Сбер, Т-Банк, Яндекс, Авито и других компаниях
🔵 mock-собеседования с обратной связью
🔵 рефералка в бигтех после защиты пет-проекта
Остались вопросы, или ты не уверен, какой курс подойдет тебе? Пиши в личку менеджеру — поможем и объясним▶️
Написать код, запустить модель или посчитать A/B-тест теперь может ИИ. Поэтому одного умения пользоваться инструментами уже мало.
Компаниям нужен человек, который понимает, какую задачу решает, может выбрать подход, заметить ошибку и довести дело до результата. Рутину поручат ИИ. Тебе доверят то, где нужно думать самому и отвечать за решение — за это и будут платить.
Именно эти навыки мы и прокачаем на курсах:
Можно взять один курс или комбо по спеццене. А если не получишь оффер - вернем деньги!
Курсы для тебя, если ты:
🔵 Готовишься к собеседованиям или к стажировкам в BigTech🔵 Получаешь отказы после собесов или не можешь даже попасть на них, не понимаешь почему🔵 Не хочешь остаться узким исполнителем, которого можно заменить подпиской на Claude🔵 Хочешь стать специалистом, который умеет работать от данных и модели до продукта, инфраструктуры и бизнеса
Все знания закрепляются на реальных задачах с собесов и рабочих кейсах. Для портфолио создаём пет-проекты, а в конце курса проводим мок-интервью, чтобы ты увереннее проходил реальные собесы. По любым вопросам на связи куратор и преподаватель.
В программу всех курсов войдет:
Остались вопросы, или ты не уверен, какой курс подойдет тебе? Пиши в личку менеджеру — поможем и объясним
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2