在Golang中找到最长的词

时间:2018-08-26 19:13:12

标签: string go

尝试使用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 :(得分:7)

“最佳”解决方案

我们甚至可以利用以下优势,使其比其他答案更紧凑:

  • 使用元组分配
  • 使用零值(best"")初始化0及其长度,并在for range处理正确的情况下省略对0个单词的检查
  • 无需将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)

利用这一点,我们可以使用命名结果参数(除非提供初始值,否则所有变量都将初始化为它们类型的zero value,对于string而言,其初始值为{{ 1}}),我们甚至可以将其编写得更紧凑,而又不会因可读性而损失任何内容:

""

测试和输出相同,请在Go Playground上进行尝试。同样,在大多数情况下,与我们存储长度相比,这可能会稍微慢一些。

答案 1 :(得分:4)

那完全可行!您可以使它更短一些,同时使用更长的变量名来解释您的意图。

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
}

如果愿意,可以更改此项以跟踪指针而不是单词本身。

答案 2 :(得分:1)

我会这样:

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 playground

上找到