В представленном коде на Go есть несколько ошибок и недочётов. Основная идея функции — нормализовать срез рун, удаляя лишние пробелы и сжимая последовательности пробелов до одного.
func normalize2(str []rune) []rune {
В представленном коде на Go есть несколько ошибок и недочётов. Основная идея функции — нормализовать срез рун, удаляя лишние пробелы и сжимая последовательности пробелов до одного.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
func normalize2(str []rune) []rune {
result := str[:0]
for val := range str {
if val != ' ' {
result = append(re)
}
}
l, r := 0, 0
isSpace := false
for i := 0, i < len(str); i++ {
val := string(str[i])
if val == " " {
if isSpace {
continue
} else {
str[r] = val
r++
isSpace = true
}
} else {
str[r] = val
r++
isSpace = false
}
}
return str[:r]
}
Ответ
В представленном коде на Go есть несколько ошибок и недочётов. Основная идея функции — нормализовать срез рун, удаляя лишние пробелы и сжимая последовательности пробелов до одного.
Исправленный и упрощённый вариант функции, который:
- Удаляет ведущие и конечные пробелы
- Заменяет последовательности пробелов одним пробелом
func normalize2(str []rune) []rune {
r := 0
isSpace := false
for _, val := range str {
if val == ' ' {
if !isSpace {
str[r] = val
r++
isSpace = true
}
} else {
str[r] = val
r++
isSpace = false
}
}
// Удаляем пробел в конце, если он есть
if r > 0 && str[r-1] == ' ' {
r--
}
return str[:r]
}
Объяснение:
- Переменная
r— индекс для записи в результирующий срез. - Флаг
isSpaceотслеживает, был ли предыдущий символ пробелом, чтобы не добавлять несколько подряд. - В конце проверяем, не остался ли пробел в конце, и удаляем его.
Такой подход позволяет эффективно нормализовать строку без выделения дополнительной памяти.