Вернуть слайс строк без повторов, сохранив порядок первого появления.
func Distinct(items []string) []string
Требования
- Каждая строка встречается в ответе один раз, на месте своего первого
появления во входе.
- Входной слайс не меняется, ответ не делит с ним массив.
- Время O(n).
nil и пустой вход — пустой результат.
Пример
names := []string{"Nina", "Oleg", "Petya", "Oleg", "Dasha", "Lera"}
Distinct(names) // [Nina Oleg Petya Dasha Lera]
Дубликатами часто считают не равные, а «похожие» элементы: строки без учёта
регистра, пользователей с одинаковым email.
func DistinctBy[T any, K comparable](items []T, key func(T) K) []T
- Два элемента — дубликаты, если
key у них совпадает. Остаётся первый.
key вызывается ровно один раз на элемент.
- Остальные требования те же.
DistinctBy([]string{"Go", "go", "Rust", "GO"}, strings.ToLower) // [Go Rust]
Устно: почему нельзя собрать ответ обходом map? Как сделать то же самое
без дополнительной памяти, если порядок не важен?
Разбор и эталонное решение — после своей попытки: на собеседовании подсказок не будет.
Сначала попробуй сам — подсказки не дают готовый ответ.