Считайте Unicode-кодовые точки через utf8.RuneCountInString, а не len: кириллица занимает несколько байт на один символ.
Подсчёт количества символов в массиве строк
Считайте Unicode-кодовые точки через utf8.RuneCountInString, а не len: кириллица занимает несколько байт на один символ.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Требуется реализовать функцию, которая:
- Принимает массив (slice) строк, в которых могут встречаться латинские буквы, кириллические символы и цифры.
- Для каждой строки возвращает количество её символов.
- Корректно обрабатывает пустые строки и строки, содержащие смешанные типы символов.
Функция должна работать независимо от того, какие из перечисленных наборов символов присутствуют в конкретной строке.
Ответ
Считайте Unicode-кодовые точки через utf8.RuneCountInString, а не len: кириллица занимает несколько байт на один символ.
Реализация:
import "unicode/utf8"
func countCharacters(values []string) []int {
counts := make([]int, len(values))
for i, value := range values {
counts[i] = utf8.RuneCountInString(value)
}
return counts
}
Для ["abc", "привет", "Aя3", ""] результат [3, 6, 3, 0]. Сложность линейна по суммарной длине строк в байтах. Это число рун, не графем: составная буква с отдельным диакритическим знаком может считаться как две. Некорректный UTF-8 требует отдельной политики валидации.