Подсчитайте, сколько раз каждое значение встречается в слайсе целых
Реализуйте counts(in), возвращающую map[int]int от каждого значения к числу его вхождений. Требование: один проход, O(n) по времени. Пример: counts([]int{1,2,2,3,3,3}) → {1:1, 2:2, 3:3}.
func counts(in []int) map[int]int {
// ваш код здесь
return nil
}
Допишите реализацию.
Создайте результат через make(map[int]int), затем пройдите по слайсу, делая m[v]++ для каждого значения. Чтение отсутствующего ключа возвращает нулевое значение 0, поэтому m[v]++ работает на первом появлении без явной проверки. Каждое обращение к map — O(1), поэтому весь подсчёт — один проход O(n), а ключи map заодно образуют множество различных значений.
- ✗Защищаться через
ok, думая, что отсутствующий ключ паникует - ✗Считать, что map нельзя инкрементировать на месте
- ✗Забывать, что отсутствующий целочисленный ключ читается как 0
- →Как найти самое частое значение, имея счётчики?
- →Как перечислить только различные значения из этой map?
Решение
m[v]++ опирается на нулевое значение отсутствующего ключа — никакой предварительной проверки.
func counts(in []int) map[int]int {
m := make(map[int]int)
for _, v := range in {
m[v]++ // отсутствующий ключ читается как 0
}
return m
}
// counts([]int{1,2,2,3,3,3}) -> map[1:1 2:2 3:3]
Чтение отсутствующего ключа в Go возвращает нулевое значение типа (0 для int), а не паникует, поэтому m[v]++ корректно стартует с 1 при первом появлении. Каждое обращение — O(1), весь подсчёт — O(n). Ключи итоговой map — это множество различных значений.