Есть поставщики: id → список городов, где он работает. Есть список
интересующих городов. Для каждого поставщика нужно оставить только пересечение
его городов с интересующими и вернуть лишь тех, у кого пересечение не пустое.
func FilterVendors(vendors map[int][]string, cities []string) map[int][]string
Требования
- Города у поставщика в результате идут в том же порядке, что в его исходном
списке.
- Поставщиков с пустым пересечением в результате нет.
- Входные данные не меняются: ни map поставщиков, ни их списки городов.
- Решение работает за O(суммарное число городов у поставщиков + len(cities)),
а не за произведение.
Пример
vendors := map[int][]string{
1: {"Berlin", "Lyon", "Turin"},
2: {"Berlin", "Lyon", "Turin", "Porto", "Oslo", "Riga"},
3: {"Lyon", "Turin", "Oslo", "Riga"},
4: {"Berlin", "Porto", "Graz"},
}
FilterVendors(vendors, []string{"Berlin", "Porto", "Graz"})
// map[1:[Berlin] 2:[Berlin Porto] 4:[Berlin Porto Graz]]
Устно: почему фильтрация «на месте» через list[:0] здесь опасна?
Разбор и эталонное решение — после своей попытки: на собеседовании подсказок не будет.
Сначала попробуй сам — подсказки не дают готовый ответ.