👎8❤1🔥1
🧩 Алгоритмическая задача: "Почти уникальные подстроки"
📜 Условие:
Дана строка
Нужно найти максимальную длину `L`, такую что существует строка длины `L`, встречающаяся всего один раз в
🔍 Пример:
⚠️ Ограничения:
- Длина строки: до
- Время — не более 1 секунды
- Нельзя использовать
- Решение должно работать за O(n log n) или O(n) с префикс-хэшами
💡 Подсказки:
- Используй **rolling hash (polynomial hashing)** — префиксный хэш + бинарный поиск по длине `L`.
- Сначала бинарный поиск по длине: `left = 1`, `right = len(s)`
- Для каждой длины — собрать все хэши и проверить, есть ли хэш с ровно одним вхождением
- Возможна коллизия — используйте **двойной хэш** или `uint64` с Mersenne prime
✅ Что проверяет задача:
- Умение применять двухфазные алгоритмы (бинарный поиск + проверка условия)
- Навыки работы с rolling hash / префикс-хэшами
- Знание тонкостей коллизий и оптимизации по памяти
📜 Условие:
Дана строка
s
длиной до 2⋅10⁵
, содержащая только строчные буквы латинского алфавита. Нужно найти максимальную длину `L`, такую что существует строка длины `L`, встречающаяся всего один раз в
s
.🔍 Пример:
s = "ababcab"
Уникальные подстроки:
длины 1: "c" ✅
длины 2: "ca" ✅
длины 3: "cab" ✅
длины 4: "abca" ✅
Но, например, "ab" встречается дважды.
Ответ: 4
⚠️ Ограничения:
- Длина строки: до
200000
- Время — не более 1 секунды
- Нельзя использовать
map[string]int
наивно — будет слишком медленно- Решение должно работать за O(n log n) или O(n) с префикс-хэшами
💡 Подсказки:
- Используй **rolling hash (polynomial hashing)** — префиксный хэш + бинарный поиск по длине `L`.
- Сначала бинарный поиск по длине: `left = 1`, `right = len(s)`
- Для каждой длины — собрать все хэши и проверить, есть ли хэш с ровно одним вхождением
- Возможна коллизия — используйте **двойной хэш** или `uint64` с Mersenne prime
✅ Что проверяет задача:
- Умение применять двухфазные алгоритмы (бинарный поиск + проверка условия)
- Навыки работы с rolling hash / префикс-хэшами
- Знание тонкостей коллизий и оптимизации по памяти
Пиши решение в комментариях
🔥4👍3❤2👎1😁1
🐹 Задача для Go 1.21+: «Контекст отменён, но горутина продолжает работу»
📌 Актуально для: Go 1.21 и новее (введён `context.WithCancelCause`)
🎯 Цель: Понять, почему горутина не завершилась по отменённому контексту
📍 Ситуация:
Ты используешь контекст для управления жизненным циклом горутины. В Go 1.21 ты решил использовать
🔍 Ты ожидаешь, что горутина завершится и выведет:
Но вместо этого — программа завершилась без вывода. Почему?
🧩 Вопросы:
1. Почему
2. Что изменилось в
3. Как безопасно читать причину отмены?
4. Как изменить
5. Почему важно не блокироваться на `ctx.Done()`, если возможна гонка?
🛠 Решение:
🔸 В Go 1.21 есть `context.WithCancelCause`, который позволяет задавать причину отмены.
Но `context.Cause(ctx)` вернёт `nil`, **если ты используешь `context.WithCancel`**, либо, если `ctx.Done()` не был срабатывающим.
🔸 В этом коде `worker(ctx)` запускается и сразу блокируется на:
<-ctx.Done()
Но если отмена происходит **до** того, как `worker` успел начать слушать `ctx.Done()`, и ты используешь старую `WithCancel`, `context.Cause` вернёт `nil`.
🔸 **Правильный способ:**
Убедись, что `context.WithCancelCause` действительно используется и `ctx.Done()` слушается вовремя.
Для Go 1.21+ пример рабочий:
🔸 Альтернатива для старых версий Go (<1.21):
ctx, cancel := context.WithCancel(context.Background())
...
fmt.Println("Worker stopped:", ctx.Err()) // вместо Cause
📌 Вывод:
Начиная с Go 1.21, `context.WithCancelCause` даёт более точный контроль за причинами отмены. Но горутины всё равно должны явно проверять `ctx.Done()` через `select`, иначе отмена может пройти незаметно.
📌 Актуально для: Go 1.21 и новее (введён `context.WithCancelCause`)
🎯 Цель: Понять, почему горутина не завершилась по отменённому контексту
📍 Ситуация:
Ты используешь контекст для управления жизненным циклом горутины. В Go 1.21 ты решил использовать
context.WithCancelCause
:
package main
import (
"context"
"fmt"
"time"
)
func main() {
ctx, cancel := context.WithCancelCause(context.Background())
go worker(ctx)
time.Sleep(1 * time.Second)
cancel(fmt.Errorf("manual stop"))
time.Sleep(2 * time.Second)
}
func worker(ctx context.Context) {
<-ctx.Done()
fmt.Println("Worker stopped:", context.Cause(ctx))
}
🔍 Ты ожидаешь, что горутина завершится и выведет:
Worker stopped: manual stop
Но вместо этого — программа завершилась без вывода. Почему?
🧩 Вопросы:
1. Почему
worker
не печатает "Worker stopped: ..."
? 2. Что изменилось в
context.WithCancelCause
по сравнению с WithCancel
? 3. Как безопасно читать причину отмены?
4. Как изменить
worker
, чтобы он корректно завершался? 5. Почему важно не блокироваться на `ctx.Done()`, если возможна гонка?
🛠 Решение:
Но `context.Cause(ctx)` вернёт `nil`, **если ты используешь `context.WithCancel`**, либо, если `ctx.Done()` не был срабатывающим.
🔸 В этом коде `worker(ctx)` запускается и сразу блокируется на:
🔸 **Правильный способ:**
Убедись, что `context.WithCancelCause` действительно используется и `ctx.Done()` слушается вовремя.
Для Go 1.21+ пример рабочий:
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("Worker stopped:", context.Cause(ctx))
return
case <-time.After(100 * time.Millisecond):
fmt.Println("Working...")
}
}
}
🔸 Альтернатива для старых версий Go (<1.21):
...
fmt.Println("Worker stopped:", ctx.Err()) // вместо Cause
📌 Вывод:
👎6👍4❤3🔥3
🐿️ Задача на логику для собеседования back-end разработчика на GO
— Мы знаем, что в десятичной системе самое большое число из одной цифры - это 9, а из двух - 99. В бинарной системе самое большое число из двух цифр это 11 (3) самое большое число из трех цифр это 111 (7) и самое большое число из 4 цифр это 1111 (15).
Вопрос: каково самое большое число из 8 цифр?
— Подсказка:
1️⃣101 - 1 = 9, a 102 - 1 = 99 (Решение через знание степеней 2)
2️⃣11110 это 15 * 2 = 30, а 111100 это 15 * 2 * 2 = 60 (Решение через битовый сдвиг)
Ответ:
255
@golang_interview
— Мы знаем, что в десятичной системе самое большое число из одной цифры - это 9, а из двух - 99. В бинарной системе самое большое число из двух цифр это 11 (3) самое большое число из трех цифр это 111 (7) и самое большое число из 4 цифр это 1111 (15).
Вопрос: каково самое большое число из 8 цифр?
— Подсказка:
1️⃣
2️⃣
Ответ:
@golang_interview
🔥4🥰2❤1🤯1
Anonymous Quiz
40%
Будет выбран первый зарегистрированный маршрут
21%
Выберется последний зарегистрированный маршрут
21%
Произойдёт ошибка маршрутизации
17%
Будут выполнены оба обработчика маршрутов
❤3🤩3👎1🥰1
🐹 Go-задача (Go 1.22+): почему вывод вас удивит?
❓ Что напечатает программа?
• a)
• b)
• c)
• d)
package main
import "fmt"
func main() {
words := []string{"go", "rust", "zig"}
ptrs := []*string{}
for i, v := range words {
if i == 1 {
words = append(words, "odin") // добавляем элемент во время range
}
ptrs = append(ptrs, &v) // сохраняем адрес переменной v
}
for _, p := range ptrs {
fmt.Println(*p)
}
}
❓ Что напечатает программа?
• a)
go rust zig
• b)
go rust zig odin
• c)
zig zig zig zig
• d)
go rust zig odin
, затем паника👍5❤4🔥4😁1
Anonymous Quiz
11%
Создаёт новый HTTP хендлер
75%
Создаёт целочисленную переменную и публикует её
10%
Обнуляет счётчик переменной
4%
Удаляет переменную
👎5👍1
Anonymous Quiz
48%
float64
5%
float32
12%
int64
4%
Ни один вышеперечисленный
31%
Любые
😁4👎3👍1
Anonymous Quiz
26%
Программа обязательно будет полностью статической
57%
Программа может зависеть от системных динамических библиотек
11%
Программа не сможет использовать сторонние библиотеки
5%
Программа будет работать только под Windows
❤4
ML-инженеры, какая встреча!
19 июля в Москве снова пройдет Turbo ML Conf от группы Т-Технологий. В этом году — еще масштабнее!
В программе 5 тематических потоков, продовые кейсы и технологии.
Среди спикеров — эксперты Т-Банка, Сбера, Яндекса и других ведущих специалистов.
Будет много нетворкинга, прикладные доклады, настольные игры, лимитированный мерч. Участие бесплатное.
Успейте оставить заявку
19 июля в Москве снова пройдет Turbo ML Conf от группы Т-Технологий. В этом году — еще масштабнее!
В программе 5 тематических потоков, продовые кейсы и технологии.
Среди спикеров — эксперты Т-Банка, Сбера, Яндекса и других ведущих специалистов.
Будет много нетворкинга, прикладные доклады, настольные игры, лимитированный мерч. Участие бесплатное.
Успейте оставить заявку
❤1
Anonymous Quiz
74%
Когда нужны только ключи
6%
Для хранения значений
9%
Пустые структуры нельзя использовать в map
11%
Для оптимизации чтения
Go-сервис генерирует логи, но вы теряетесь в поиске и анализе?
Хотите научиться строить быстрый и надёжный поиск по данным микросервисов?
📅 17 июля в 20:00 (МСК) — открытый урок «Взаимодействие микросервиса на Go и Elasticsearch».
Разберём:
▪️ Архитектуру микросервисов на Go и ключевые нюансы
▪️ Базовые принципы работы с Elasticsearch
▪️ Интеграцию Go-сервиса с Elasticsearch для логирования и поиска
▪️ Настройку индексов, фильтрацию и агрегации
Представьте, что вы разворачиваете микросервис, подключаете его к Elasticsearch, логируете события и выдаёте мгновенный полнотекстовый поиск по данным. Ваш сервис становится прозрачным и управляемым.
🚀 Регистрируйтесь на урок «Взаимодействие микросервиса на Go и Elasticsearch»: https://otus.pw/V6vB/?erid=2W5zFHLnAec
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
Хотите научиться строить быстрый и надёжный поиск по данным микросервисов?
📅 17 июля в 20:00 (МСК) — открытый урок «Взаимодействие микросервиса на Go и Elasticsearch».
Разберём:
▪️ Архитектуру микросервисов на Go и ключевые нюансы
▪️ Базовые принципы работы с Elasticsearch
▪️ Интеграцию Go-сервиса с Elasticsearch для логирования и поиска
▪️ Настройку индексов, фильтрацию и агрегации
Представьте, что вы разворачиваете микросервис, подключаете его к Elasticsearch, логируете события и выдаёте мгновенный полнотекстовый поиск по данным. Ваш сервис становится прозрачным и управляемым.
🚀 Регистрируйтесь на урок «Взаимодействие микросервиса на Go и Elasticsearch»: https://otus.pw/V6vB/?erid=2W5zFHLnAec
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
❤1
Anonymous Quiz
41%
Mediator
30%
Observer
18%
Decorator
8%
Builder
3%
Proglibator
👎6
💡 Go-хак дня:
Ключевое слово
Вот что с ним можно:
🔹 Создавать собственные типы на основе
🔹 Давать удобные псевдонимы стандартным типам
🔹 Прикреплять методы к любому типу — даже к обычному
Это позволяет писать чистый, читаемый и расширяемый код.
Управляй логикой через свои типы — и код начнёт работать на тебя 💪
#GoLang #GoTips #LearnGo
@golangtests
Ключевое слово
type
в Go — это мощный инструмент, а не просто способ объявить struct
.Вот что с ним можно:
🔹 Создавать собственные типы на основе
int
, string
, map
и т.д. 🔹 Давать удобные псевдонимы стандартным типам
🔹 Прикреплять методы к любому типу — даже к обычному
int
Это позволяет писать чистый, читаемый и расширяемый код.
Управляй логикой через свои типы — и код начнёт работать на тебя 💪
#GoLang #GoTips #LearnGo
@golangtests
❤5👍2🔥2