Найти самое длинное слово в Голанге - PullRequest
0 голосов
/ 26 августа 2018

Пытаюсь найти самое длинное слово, используя Go из предложения.

В данный момент я использую этот метод:

func longestWord(s string) string {

    newArr := strings.Split(s, " ")

    l := len(newArr[0])
    long := newArr[0]
    var result string
    // fmt.Println(long)
    for _, lenString := range newArr {

        if len(lenString) > l {
            // ll := len(lenString)
            // l := len(lenString)
            d := &l
            p := &long
            c := &result
            *d = len(lenString)
            *p = lenString
            *c = lenString
            // fmt.Println(lenString)
        } else {
            c := &result
            *c = newArr[0]
        }

    }
    return result
}

func main() {
    args := "Monday Tuesday Friday Sunday Wednesday"
    fmt.Println(longestWord(args))
}

Но я не уверен, что это лучшееметод для достижения этого.Есть ли другой элегантный способ сделать это?Я знаю, что есть еще один метод с использованием сортировки, но я бы предпочел больше использовать способ с итерацией между словами.

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

Я бы сделал это так:

func longestWord(s string) string {

newArr := strings.Split(s, " ")

longestWord := ""
longestLength := 0

    // loop through the array
    for _, word := range newArr {
        // save length of word in the actual iteration
        length := len(word)

        // if length is larger, than longest
        if length > longestLength {
            // save the new longest word
            longestWord = word
            longestLength = length
        }
    }


// return the longest word
return longestWord
}

Реализацию можно найти на go площадке

0 голосов
/ 26 августа 2018

«Лучшее» решение

Мы даже можем написать его более компактно, чем другие ответы, воспользовавшись следующими преимуществами:

  • с использованием присвоений кортежей
  • инициализация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 .Опять же, в большинстве случаев это, вероятно, немного медленнее по сравнению с тем, когда мы сохраняем длину тоже.

0 голосов
/ 26 августа 2018

Это полностью работает!Вы могли бы сделать его немного короче, а также использовать более длинные имена переменных, которые объясняют немного больше о вашем намерении.

func longestWord(s string) string {
    words := strings.Split(s, " ")
    if len(words) == 0 {
        return ""
    }
    best := words[0]
    best_length := 0
    for _, word := range words {
        if len(word) > best_length {
            best = word
            best_length = len(word)
        }
    }
    return best
}

Вы можете изменить это, чтобы отслеживать указатель вместо словасам, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...