VK / ВК (ВКонтакте) - 1
Актуальность: 2 кв 2025
Вопросы с тех скрининга: Задача 1
Заголовок раздела «Вопросы с тех скрининга: Задача 1»Задача: (код без описания) go/basics
Заголовок раздела «Задача: (код без описания) go/basics»/_Поиск двух чисел в массиве, сумма которых равна заданному числу.Напиши функцию, принимающую массив из положительных неупорядоченных чисел первым аргументом и положительное число вторым аргументом.Функция должна возвращать true, если в массиве есть 2 числа, которые в сумме дают 2-й аргумент.Важно: задача должна решаться за O(n log n) или O(n)
Пример 1:Input: ([10, 15, 3, 7], 17)Output: true
Пример 2:Input: ([1,2,3,4,5,6], 12)Output: false_/
func main() {// Код}/*В кинотeaтре места расположены в один ряд. Только что пришедший зритель выбирает место так, чтобы сидеть максимально далеко от остальных зрителей в ряду.То есть расстояние от того места, куда он сядет, до ближайшего зрителя должно быть максимально возможным.Гарантируется, что в ряду всегда есть свободные места и уже сидит хотя бы один зритель.Напишите функцию, которая по заданному ряду мест (массиву из нулей и единиц) вернет расстояние от выбранного места до ближайшего зрителя.Пример:Input: [0, 1, 0, 0, 0, 1]Output: 2*/
func main() { // Код} Сервис получает сообщения об обновлении документов в формате:
message Document {string Url = 1; // Уникальный идентификатор документаuint64 PubDate = 2; // Заявленное время публикацииuint64 FetchTime = 3; // Время получения обновления (версия)string Text = 4; // Текст документаuint64 FirstFetchTime = 5; // Требуется заполнить}
Документы могут поступать в произвольном порядке (не в том, как они обновлялись), также возможно дублирование отдельных сообщений.
Необходимо на выходе формировать такие же сообщения, но с исправленными отдельными полями по следующим правилам (все нижеуказанное - для группы документов с совпадающим полем Url):
- Поле Text и FetchTime должны быть такими, какими были в документе с наибольшим FetchTime, полученным на данный момент;- Поле PubDate должно быть таким, каким было у сообщения с наименьшим FetchTime;- Поле FirstFetchTime должно быть равно минимальному значению FetchTime.
Т. e. в каждый момент времени мы берем PubDate и FirstFetchTime от самой первой из полученных на данный момент версий (если отсортировать их по FetchTime), а Text - от самой последней.
Интерфейс в коде можно реализовать таким:type Processor interface {Process(doc *Document) (*Document, error)}
Данный код будет работать в сервисе, читающим входные сообщения (Kafka или подобное), и записывающим результат также в очередь. Если Process возвращает Null - то в очередь ничего не пишется.Описание задачи: Нужно реализовать простую систему нотификаций на сайте с методами получения последней и случайной нотификации.
Требования к решению:
- Реализуйте класс NotificationQueue, который будет представлять собой очередь из объектов Notification. Каждый Notification имеет свой текст и время создания.- Реализуйте метод addNotification(Notification notification), который добавляет нотификацию в конец очереди- Реализуйте метод popNotification(), который возвращает и удаляет первый элемент в очереди- Реализуйте метод getRandomNotification(), который возвращает случайную нотификацию из очереди.- Все созданные методы должны пройти юнит-тесты.
Пример использования:NotificationQueue queue = new NotificationQueue();
Notification notification1 = new Notification("Первая нотификация ", new Date());Notification notification2 = new Notification("Вторая нотификация ", new Date());Notification notification3 = new Notification("Третья нотификация ", new Date());
queue.addNotification(notification1);queue.addNotification(notification2);queue.addNotification(notification3);
queue.popNotification(); // "Первая нотификация "Notification randomNotification = queue.getRandomNotification();Просят написать решение в локальной IDE с шарингом экрана.
Доп задания
Заголовок раздела «Доп задания»- сделать написанный код переиспользуемым (т.e. не все в main, а создать структуру мини проекта и разнести по пакетам);
go/structs-methods - написать тесты для созданных методов;
testing/general - подумать о многопоточности (если сразу это не уточнил и не сделал).
go/concurrency
В общем тут как на системном дизайне нужно постоянно уточнять и спрашивать про особенности, и проговаривать все свои шаги.
На вход веб-сервису приходит HTTP-запрос: по данному пользователем нормализованному урлу скопировать изображение во внутренний сервис для хранения картинок и получить внутренний id в сервисе хранения.Либо вернуть уже существующий id, если этот урл был загружен ранее. Нельзя заливать дважды картинку с в точности совпадающим урлом, иначе хранилище зря забивается.
Требования по обработке ошибок:
- если загрузка не удалась из-за некорректного урла, хотим возвращать 400 (bad request)- в случае ошибок, связанных с конфликтующими параллельными запросами, хотим возвращать 409 (conflict)- в случае ошибок обработки на стороне сервера, хотим возвращать 500 (internal server error)
Необходимо реализовать production-ready менеджер для заливки картинок по урлам в уже готовый сервис для хранения картинок.
Нужно использовать готовый интерфейс клиента для заливки изображения в сервис хранения по урлу.
Обратите внимание, что если вызвать несколько раз UploadImage с одним и тем же урлом, то картинка будет заливаться повторно, пространство хранилища будет расходоваться зря.Чтобы решить эту проблему, предлагается использовать вспомогательную базу данных.
Нужно предложить интерфейс для работы со вспомогательной базой данных (без реализации) и, опираясь на него,реализовать логику в менеджере для обработки запросов:type ImagesStorage interface { // В случае успеха возвращает уникальный внутренний id, не проверяет был ли этот урл залит ранее // Если картинка не грузится из-за неправильного урла, возвращается ошибка ErrInvalidURL. UploadImage(url string) (string, error)
// Получение сохраненной картинки по id, не требуется в данной задаче. GetImage(id string) (IDbyte, error)}
var ErrInvalidURL = errors.New("invalid url ")
// Менеджер обработки запросов, логику которого нужно реализоватьtype Manager struct{}Шаблон для написания решения
Заголовок раздела «Шаблон для написания решения»Задача: Реализовать inmemory очередь с методами Push() для добавления нового элемента, Pop() - для получения и удаления элемента с головы и GetRnd() для получения случайного элемента без его удаления. Также необходимо написать тесты для этих методов. algorithms/data-structures
Заголовок раздела «Задача: Реализовать inmemory очередь с методами Push() для добавления нового элемента, Pop() - для получения и удаления элемента с головы и GetRnd() для получения случайного элемента без его удаления. Также необходимо написать тесты для этих методов. algorithms/data-structures»Доп. вопросы
Заголовок раздела «Доп. вопросы»- определить сложность алгоритма по эти методам;
algorithms/complexity - указать как еще можно реализовать эту очередь (на основе каких объектов);
algorithms/data-structures - ответить на ряд вопросов по многопоточной работе с это чередью и особенностях работы рантайма.
go/runtime