Привет, чемпион!
Возможно, ты сейчас готовишься к собеседованию в какую-нибудь IT-компанию. Скорее всего, тебе будут задавать технические вопросы, поэтому тебе приходится готовиться. Но, возможно, ты всё равно не сможешь ответить на все вопросы правильно. Как быть?!
А слышал ли ты про новую умную chatGPT? А что, если я тебе скажу, что больше готовиться к собеседованиям так усердно не нужно! Что?! Задаваемые тебе вопросы можно делегировать chatGPT.
В общем, нет времени объяснять, давай устроим собес для chatGPT по Data Science и узнаем, сможет ли сетка его пройти?! Всё по классике — спрашиваем вопросы по 4 секциям:
- Программирование — Python и алгоритмы,
- Написание SQL-запросов,
- Data Science и статистика,
- ML System Design.
▍ ????????Секция программирования (medium и hard)
???? Задача Medium-уровня: для заданной строки
s
найди длину самой длинной подстроки без повторяющихся символов. Используй язык Python.Ответ GPT:
def find_longest_substring(s):
# Create a dictionary to store the last seen index for each character
char_indices = {}
# Initialize the longest substring length to 0
longest = 0
# Initialize the start and end indices for the current substring
start = 0
end = 0
# Iterate through the string
while end < len(s):
# If the current character is not in the dictionary, add it and move the end index
if s[end] not in char_indices:
char_indices[s[end]] = end
end += 1
# Otherwise, update the start index to be one past the last seen index for this character
else:
start = char_indices[s[end]] + 1
char_indices[s[end]] = end
end += 1
# Update the longest substring length if necessary
longest = max(longest, end - start)
# Return the longest substring length
return longest
# Test the function
s = "abcabcbb"
print(find_longest_substring(s)) # Should print 3
Эта функция имеет временную сложность
O(n)
, где n
— длина входной строки. Это связано с тем, что он перебирает каждый символ в строке ровно один раз.???? Комментарий: Даже это же просто вау! Сетка сгенерировала этот ответ за пару секунд. Даже мне бы пришлось подумать, как реализовать, а тут подробное решение за мгновение. Может быть, это тупо заготовленный ответ? Попробуем дать задачу посложнее!
???? Задача Hard-уровня: Имея две строки str1 и str2, вернуть самую короткую строку, в которой есть как str1, так и str2 в качестве подпоследовательностей. Если есть несколько допустимых строк, верните любую из них. Строка s является подпоследовательностью строки t, если удаление некоторого количества символов из t (возможно, 0) приводит к строке s.
Решение от ChatGPT: Чтобы решить эту проблему, вы можете использовать двоичное дерево поиска (BST) для хранения элементов массива
nums
. Каждый узел в BST будет хранить значение элемента, а также количество элементов в поддереве, корнем которого является этот узел. Затем для каждого элемента в массиве nums
вы можете пройти BST, начиная с корня и переходя к левому дочернему элементу, если элемент меньше текущего узла, или к правому дочернему элементу, если элемент больше или равен текущему узлу. Всякий раз, когда вы идёте влево, вы добавляете количество элементов в правом поддереве текущего узла к результату для этого элемента (поскольку все эти элементы меньше, чем текущий элемент). Когда вы достигаете конечного узла, вы вставляете элемент в дерево и обновляете количество всех узлов на обратном пути к корню. Вот некоторый псевдокод, демонстрирующий этот подход:# define a Node class to represent a node in the binary search tree
class Node:
# initialize the node with a given value
def __init__(self, val):
self.val = val
self.left = None
self.right = None
self.count = 1
# insert a new element into the subtree rooted at this node
def insert(self, val):
# if the value is smaller than the current node, go left
if val < self.val:
# if there is no left child, insert the element as the left child
if not self.left:
self.left = Node(val)
# otherwise, insert the element into the left subtree
else:
self.left.insert(val)
# if the value is greater than or equal to the current node, go right
else:
# if there is no right child, insert the element as the right child
if not self.right:
self.right = Node(val)
# otherwise, insert the element into the right subtree
else:
self.right.insert(val)
# increment the count of the node
self.count += 1
# search for an element in the subtree rooted at this node
# return the number of elements smaller than the given element
def search(self, val):
# initialize the result to 0
result = 0
# if the value is smaller than the current node, go left
if val < self.val:
# if there is no left child, return 0
if not self.left:
return 0
# otherwise, search the left subtree and return the result
else:
return self.left.search(val)
# if the value is greater than or equal to the current node, go right
else:
# if there is no right child, insert the element into the tree
if not self.right:
self.right = Node(val)
# otherwise, search the right subtree and return the result
else:
result = self.right.search(val)
# add the number of elements in the right subtree of the current node to the result
# (since all of these elements are smaller than the given element)
result += self.count - (self.right.count if self.right else 0)
# return the result
return result
# initialize the binary search tree with
???? Комментарий: Ого, идейно решение верное. И действительно, задачу можно решить через BST (Binary search tree). Если сравнить с рабочим решением, то код неплох. Да, конечно, можно придраться, что это псевдокод, но смог бы живой человек накропать верно работающий код в рамках собеседования за пару секунд?! Завит от случая! Думаю, что задачу, скорее всего, засчитали бы (но это не точно).
▍ ???? Секция SQL (общие вопросы и hard-задача)
???????? Задача: Приведи примеры работы оконной функции.
Ответ: Конечно, вот несколько примеров использования функции ROW в SQL:
-
SELECT ROW(1, 2, 3)
— возвращает одну строку с тремя столбцами, содержащими значения 1, 2 и 3. -
SELECT ROW(col1, col2) FROM table
— возвращает строки в таблице со значениями из столбцов col1 и col2 в виде одной строки. -
SELECT ROW(col1 + col2, col3 - col4) FROM table
— возвращает одну строку с двумя столбцами, содержащую результат указанных выражений, применённых к столбцам вtable
.
Это всего лишь несколько примеров того, как функция ROW может использоваться в SQL. Это полезная функция для создания строк с определёнными значениями или выражениями на основе столбцов в таблице.
???????? Вопрос: Окей, а какие вообще оконные функции бывают?
Ответ: В SQL есть несколько функций строк, которые можно использовать для управления строками данных в таблице. Вот несколько примеров некоторых общих функций строк:
-
ROW_NUMBER
— эта функция присваивает уникальный номер каждой строке в результирующем наборе, начиная с 1 для первой строки. Например,SELECT ROW_NUMBER() OVER (ORDER BY col1) FROM table
присваивает уникальный номер каждой строке в таблице, упорядоченной по столбцу col1. -
RANK
— эта функция присваивает ранг каждой строке в результирующем наборе на основе значений в указанном столбце. Например,SELECT RANK() OVER (ORDER BY col1) FROM table
присваивает ранг каждой строке таблицы на основе значений в столбце col1. -
DENSE_RANK
— эта функция похожа на функциюRANK
, но она не пропускает ни одного ранга для ничьих. Например,SELECT DENSE_RANK() OVER (ORDER BY col1) FROM table
присваивает ранг каждой строке в таблице на основе значений в столбце col1, не пропуская ни одного числа для связи.
Это всего лишь несколько примеров функций строк в SQL. Существует множество других функций, которые можно использовать для управления строками данных в таблице, например
FIRST_VALUE
, LAST_VALUE
, LEAD
и LAG
.???? Комментарий: Отличный ответ! Такой компактный и чёткий ответ даже загуглить не получится так просто. Кажется, chatGPT умеет преобразовывать своё латентное пространство знаний в настоящий шипучий коктейль информации/знаний.
???????????? Не будем мелочиться и попросим GPT придумать себе задачу и решить её!
Задача: Можешь сама придумать и решить сложную задачу на SQL c использованием оконной функции?
Ответ: Конечно, вот более сложная табличная задача SQL, включающая функцию
ROW
: Выдуманная задача: Напишите запрос SQL для создания новой таблицы с именем
sales
, которая содержит следующие столбцы: date
, product
, quantity
и total_price
. Столбец date должен содержать дату продажи, столбец product
должен содержать название проданного продукта, столбец quantity
должен содержать количество проданных единиц, а столбец total_price
должен содержать общую цену продажи. Таблица также должна включать столбец с именем row_data
, который содержит значения date
, product
, quantity
и total_price
для каждой строки в виде одной строки. Чтобы решить эту задачу, вы можете использовать функцию ROW
для создания столбца row_data
, как показано в следующем запросе:Решение: Чтобы решить эту задачу, можем использовать функцию ROW для создания столбца row_data, как показано в следующем запросе:
CREATE TABLE sales (
date DATE NOT NULL,
product TEXT NOT NULL,
quantity INTEGER NOT NULL,
total_price REAL NOT NULL,
row_data ROW(date, product, quantity, total_price)
);
Этот запрос создаёт таблицу с именем
sales
с указанными столбцами. Столбцы date
, product
, quantity
и total_price
используются для хранения сведений о продажах, а столбец row_data
использует функцию ROW
для создания одной строки со значениями date
, product
, quantity
и total_price
для каждой строки в таблице.????Комментарий: Очень недурно. Сходу выдумать структуру базы данных с реальными значениями и далее придумать задачку на то, чтобы написать запрос под неё — это впечатлят.
▍ ???? Секция Data Science (сразу сложные вопросы!)
???? Задача: Расскажи, что такое tf-idf, и потом реализуй этот метод с примерами.
Ответ chatGPT:
from collections import defaultdict
def tf(docs):
# Create a dictionary where the keys are the words in the document
# and the values are their frequencies
tf_values = defaultdict(lambda: 0)
for doc in docs:
for word in doc.split():
tf_values[word] += 1
return tf_values
def idf(docs):
# Create a set of words that appear in at least one document
idf_values = set()
for doc in docs:
for word in doc.split():
idf_values.add(word)
# Calculate the inverse document frequency for each word
idf_values = {word: 1 / len(docs) for word in idf_values}
return idf_values
def tf_idf(docs):
# Calculate the term frequency values for each document
tf_values = tf(docs)
# Calculate the inverse document frequency values for each word
idf_values = idf(docs)
# Calculate the tf-idf values for each word in each document
tf_idf_values = []
for doc in docs:
tf_idf_values.append({word: tf_values[word] * idf_values[word] for word in doc.split()})
return tf_idf_values
# Example usage
docs = [
"this is a sentence",
"this is another sentence",
"yet another sentence"
]
print(tf_idf(docs))
Эта реализация вычисляет значения частоты термина (
tf
) для каждого слова в каждом документе, значения обратной частоты документа (idf
) для каждого слова, а затем объединяет эти значения для вычисления значений tf-idf для каждого слова в каждом документе.???? Комментарий: Вау! И это верно! Да я бы сам, если бы не подсмотрел формулу, не ответил. А тут ещё и полная почти корректная реализация, которая работает. Не хватает логарифма, но все равно зачёт!
▍ ???? Секция статистики
????Вопрос #1: Когда использовать t-test, а когда z-test?
Ответ: Z-критерий и t-критерий — это два типа тестов статистической гипотезы, которые используются для оценки различий между двумя группами. Z-критерий используется, когда известно стандартное отклонение совокупности, а t-критерий используется, когда стандартное отклонение совокупности неизвестно и должно быть оценено на основе данных выборки. В целом z-критерий используется реже, чем t-критерий, потому что обычно трудно узнать стандартное отклонение генеральной совокупности.
???? Комментарий: Верно!
???? Вопрос #2: У вас есть 40 карт четырёх цветов: 10 красных, 10 зелёных, 10 синих и 10 жёлтых. Каждый цвет имеет номер от 1 до 10. Когда вы выбираете две карты без замены, какова вероятность того, что две карты не одного цвета и не одного номера?
Давайте тут сразу оригинальный ответ посмотрим!
???? Комментарий: Верно? Давайте тут каждый читатель сам подумает и оставит ответ в комментариях, верно решена задача или нет?)
▍ ???? Секция ML System Design
???????? Вопрос: А задезайни какую-нибудь ML-систему для YouTube, сможешь?
Ответ chatGPT: Чтобы разработать систему машинного обучения для YouTube, нам сначала нужно определить конкретную проблему, для решения которой будет использоваться система. Например, систему можно использовать для рекомендации видео пользователям на основе их предыдущей истории просмотров, для классификации видео по разным категориям для улучшения организации платформы или для обнаружения и удаления неприемлемого или оскорбительного контента.
Как только конкретная проблема будет определена, мы можем приступить к разработке системы машинного обучения. Это будет включать сбор и подготовку набора данных, соответствующих данных YouTube, таких как история просмотров пользователей, метаданные видео и любая другая соответствующая информация. Затем набор данных будет использоваться для обучения модели машинного обучения, такой как алгоритм рекомендации или классификатор, с использованием подходящего метода машинного обучения.
После обучения модели её можно интегрировать в платформу YouTube и использовать для прогнозирования или выполнения действий на основе полученных данных. Систему также необходимо будет регулярно контролировать и обновлять, чтобы гарантировать, что она продолжает работать хорошо, и включать любые новые данные или изменения в платформу.
В целом разработка системы машинного обучения для YouTube будет включать сбор и подготовку данных, обучение модели и интеграцию в платформу, а также постоянный мониторинг и обслуживание.
???? Комментарий: В целом красивый и краткий ответ, можно было бы более развёрнуто ответить, но зато всё по фреймворку: сперва проблема, а потом решение. GPT ответила чётко по вот такому фреймворку:
Чекпоинты для проверки корректности рассуждений по ML систем-дизайну
▍ ???? А что по зарплате-то?! Сколько платить?
???????????? Вопрос: А какие твои зарплатные ожидания?
Ответ: Как крупная языковая модель, обученная OpenAI, у меня нет возможности получать зарплату или иметь зарплатные ожидания. Я цифровой помощник, призванный предоставлять информацию и отвечать на вопросы в меру своих возможностей на основе моего обучения. Моя основная цель — помогать и приносить пользу пользователям, которые взаимодействуют со мной.
▍ ???? Выводы и мысли
Можно с уверенностью сказать, что на chatGPT в некоторых вопросах можно опираться при ответе. GPT не поможет вам решать сложные математические задачки на логику, но вот покодить или написать за вас запрос, или просто подсказать вам теорию chatGPT может идеально.
Становится реально страшно, когда ты видишь, что у людей появляется такой мощный инструмент, способный дать им возможность для халявы. Теперь рекрутёрам придётся задавать более сложные вопросы, иначе люди могут просто вбивать их в chatGPT и бездумно отвечать. Кажется, что такой инструмент может сильно увеличить ваши шансы на позиции по типу junior. А возможно, даже поможет и Middle-уровню, если на собеседовании надо много кодить. Можно брать за основу код сетки, а потом уже доредачивать его самому. Круто же!
Спасибо, что дочитал статью до конца. Можешь прислать свой запрос для chatGPT в комментарии, пришлю ответ. А если тебе понравилось, то предлагаю следить за моим Telegram-каналом. Там я рассказываю о практичных вещах из мира Data Science, собеседованиях и соревнованиях на Kaggle.
Комментарии (34)
akakoychenko
14.12.2022 12:41+1Правильно понимаю, что единственный бредовый ответ это упоминание функции ROW() в SQL?
Хотя... Может она реально существует в какой-то малоизвестной или устаревшей БД, дока которой не гуглится. Или же это сигнал, что тот случай, что, хоть функции и не существует, но ее стоило бы придумать?
Aleron75 Автор
14.12.2022 14:27Возможно сетка имела в виду
row_number()
, но чтоб не пугать нас своей гениальность, специально немного ошиблась =) В целом ответ отличный же!
fakedup
15.12.2022 11:33В Presto есть тип данных ROW, контейнер объектов с именованными полями, и там все примеры будут корректно работать.
mikhanoid
15.12.2022 14:14+1Задачу о строке, содержащей две заданные подстроки, она тоже не решила. И ответ нерелевантный. Через бинарный поиск задача не решается
nonickname227
14.12.2022 12:42# Calculate the inverse document frequency for each word idf_values = {word: 1 / len(docs) for word in idf_values}
Разве idf так вычисляется?
datacompboy
14.12.2022 13:15Просто спросите её может ли она посчитать сумму элементов массива быстрее, чем за O(N). Меня её ответ впечатлил.
Geckelberryfinn
14.12.2022 14:06It is not possible to calculate the sum of an array faster than O(n), where n is the number of elements in the array. This is because in order to calculate the sum of an array, you must visit each element in the array at least once. Therefore, the best you can do is to use a linear time algorithm, which has a time complexity of O(n).
Вроде все ок, в чем удивление? Правда, до этого она предлагала мне O(N log N) алгоритм, типа Divide-and-Conquer. При этом отмечала, что достоинства этого подхода - это возможность распараллеливания.
datacompboy
14.12.2022 16:51+4Мне вот что она предлагала. но я, конечно, жал кнопчоку что она гонит.
Еще спросите MD5 хеш от “test” и от "test5test" напирмер. Хорошо показывает что она не вычисляет, а аппроксимирует, и что именно она там аппроксимирует -- я помолчу :)
datacompboy
14.12.2022 17:20+6Еще она мне доказывала что итерирование по вектору требует O(N) памяти. В общем, всё зависит от попадания в корпус обучения. Выводов она делать таки не умеет.
Dharaseostad123
15.12.2022 11:31STAD Solution is an IT Training and Development company. We provide Best Software testing Training in Ahmedabad.
Thank you for sharing this website.
http://www.stadsolution.com/software-testing-training-ahmedabad.html
Alexandroppolus
14.12.2022 13:25+3В leethard-задаче условие и ответ совсем разные (причем ответ в общем случае хреновый). С таким подходом собес не пройти :)
teleport1995
14.12.2022 13:38+4В первой алгоритмической задаче предложенное решение неправильное. Для строки "abba" оно выдаёт ответ 3, когда правильный ответ 2. И дело не просто в ошибке +-1, а в целом алгоритм неправильный.
bogolt
14.12.2022 17:36+5Никого не смущает что функция поиска самой длинной подстроки из уникальных символов не работает?
# Test the function s = "a5b5c5a5b5c5" print(find_longest_substring(s))
выводит 6 хотя вроде бы должно быть 3
Да и по коду видно что оно просто прибавляет `end` и заменяет новые значения `char_indices` не проверяя что лучший результат мог быть ранее в строкеbogolt
14.12.2022 17:37+2Впрочем мы же разбираем возможность пройти собеседование, а не решить правильно задачу, чего это я
bogolt
14.12.2022 18:17+1> Имея две строки str1 и str2, вернуть самую короткую строку, в которой есть как str1, так и str2 в качестве подпоследовательностей.
…result += self.count - (self.right.count if self.right else 0)
я не понял ни задачу ни решение, но скажите пожалуйста почему в вопросе «вернуть самую короткую строку» а в ответе у нас возвращается целое число?
И по каким признакам вы засчитали этот ответ? И еще неплохо бы примеры входных параметров и решений чтобы лучше можно было разобраться в задаче. Я всего лишь кожаный мешок и мне формулировка кажется неясной.
BugM
15.12.2022 01:27+5Неверный код
Просто глупость какая-то
Несуществующая функция это весело, но нет.
Ну еще туда-сюда.
Тоже глупость какая-то
Спасибо, мы вам перезвоним.
Zara6502
и в чем смысл? работу кто работать будет? тоже чат?
Aleron75 Автор
Работу порой делать проще, чем пройти удачно кодинг интевью с первого раза в условиях ограниченного времени.
Zara6502
поверьте, значит вам в этой компании делать нечего, рыба сгнила с головы.
PS: не скажу за все-все-все компании но со мной делился опытом брат, опытом прохождения собеседований в Москве, Питере и - за границей. Так вот только в РФ задают какие-то абстрактные задачки, решать которые в работе никто и никогда не будет. Поэтому он пару лет работая за границей покатался в командировки в Москву/Питер, походил на собеседования и просто забил на это в РФ. Пусть дальше сидят и собеседуют до посинения, а он работу работает и успешно.
Spunreal
Вот так 1 человек на своём опыте помог сделать вывод о собеседованиях во всём мире.
Если взять реальную задачу, то её надо переделать под собеседование - убрать лишние детали и оставить только то, что важно для работы. И мы получаем опять абстрактную задачу.
datacompboy
Задача должна быть похожей на реальную.
"У нас есть сеть предпрятия с общей шарой. Место не резиновое, а народ любит тащить копии в свои папки. Нам надо скрипт который незаметно уберёт дубликаты но так чтоб никто не догадался. Как нам это сделать?" -- покажет опыт, навык, и всегда можно сказать "сеть огорожена, такой тулзы нет, но есть баш или питон -- сможете?" и посмотреть как кандидат еще и кодить умеет а не помнит специфичные тулзы на память.
anwender95
А как правильно решить эту задачу? Симлинки\хардлинки вместо дубликатов оставить?
datacompboy
Симлинки не сделает это прозрачным, так как если удалят оригинал, пропадут все копии. То есть хардлинки. Да, это означает что редактировать их нельзя. Можно закрыть доступами. Теперь вопрос как найти дубликаты. И что такое дубликат. И равенство хеша не гарантия. И время не бесконечное, как и память.
Zara6502
Нет. Абстрактная задача - это когда вас просят сделать то, чего в реальной работе вы никогда делать не будете. А частная задача - это утрирование реальной задачи до уровня собеседования.
Когда человек собеседуется в EA, PeopleCanFly, Blizzard и т.д. и ему дают реальные задачи, то наверное он в состоянии дать оценку тому трешу, который спрашивают в РФ.
Как эквивалент по конкретно моей работе сисадмином с 99% вероятностью на собеседовании будет вопрос об "уровнях OSI" или "о стеке TCP", но за 25 лет работы я максимум от сети использовал только понимание того что такое управляемый маршрутизатор или неуправляемый и как работают nslookup, ping, tracert и telnet. (даже когда я занимался настройкой Cisco)
Так же как до сих пор в некоторых учебных заведениях учат Turbo Pascal вместо питона и вместо BigData или Web - сортировку пузырьком. Да-да, я знаю что вы скажете что это основа, пусть и так, она ее можно изучать параллельно в формате методички и практического занятия, а не посвещать этому целый год.
Мы недавно с одним товарищем запускали курс по DevOps в контакте с универом, как тестовая площадка. Занятий всего на месяц, то есть 20 академических часов, а результат куда более интересный и практически полезный для студентов, чем ква-ква Делфи/ООП.
mrbald
Об уровнях OSI важно знать, что они есть, иначе будешь тестировать TCP latency командой ping. Как у вас получилось не зацепить BGP и MPLS при настройке маршрутизаторов?
Zara6502
момент в том что моя работа никак не связана ни с OSI ни с TCP latency, я не сетевик. А чтобы поручить мне настройку цисок меня никто не спрашивал - гугл в руки и вперёд. Поэтому что такое BGP и MPLS я не знаю.
Я и говорю об абсурдности тестовых заданий на собеседованиях. Это не значит что такой абсурд в 100% компаний, нет, но это очень частое явление.
Пару работ назад мне распечатали опросник, я его прошел, по моему мнению на 90% верно, но принят был главным сисадмином со словами "ух как ты много всего написал, даже я не знаю и половины ответов, ну значит ты нам подходишь". При этом опросник тоже включал и модель OSI и как командной строкой посмотреть ip адрес и т.п. Словно меня берут в первый класс школы юного сисадмина.
А на последней работе важным было администрирование сайта, нужны знания PHP и администрирование почты. Сказал что опыта такого у меня нет. По факту взяли, но "администрирование почты" это бесплатный ящик на Яндексе, а сайта - это вбивать новости через Битрикс админку.