«Лучшее» решение
Мы даже можем написать его более компактно, чем другие ответы, воспользовавшись следующими преимуществами:
- с использованием присвоений кортежей
- инициализация
best
и его длина с нулевыми значениями (""
и 0
) и пропуском проверки на 0 слов, поскольку for range
обрабатывает, что - не нужно хранить
words
каклокальная переменная, поскольку она используется только в цикле
Мы ничего не теряем из-за читабельности:
func longestWord(s string) string {
best, length := "", 0
for _, word := range strings.Split(s, " ") {
if len(word) > length {
best, length = word, len(word)
}
}
return best
}
Тестирование:
fmt.Printf("%q\n", longestWord(""))
args := "Monday Tuesday Friday Sunday Wednesday"
fmt.Printf("%q\n", longestWord(args))
Вывод (попробуйтена Go Playground ):
""
"Wednesday"
Самое компактное решение
Обратите внимание, что сохранение длины best
является необязательным и предназначено исключительно для целей оптимизации, посколькуесли у нас есть best
, его длина всегда будет len(best)
.
Воспользовавшись этим, и мы сможем использовать именованные параметры результата (и что все переменные инициализируются нулевым значением их типов, если не указано начальное значение, которое для string
""
), мы можем даже написать его более компактно, снова не теряя ничего от читабельности:
func longestWord(s string) (best string) {
for _, word := range strings.Split(s, " ") {
if len(word) > len(best) {
best = word
}
}
return
}
Тестирование и вывод одинаковы, попробуйте на Go Playground .Опять же, в большинстве случаев это, вероятно, немного медленнее по сравнению с тем, когда мы сохраняем длину тоже.