在golang找到最长的单词

Ili*_*ici 5 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))
}
Run Code Online (Sandbox Code Playgroud)

但我不确定这是实现这一目标的最佳方法.还有其他优雅的方法吗?我知道使用sort还有一种方法,但我更喜欢使用单词之间的迭代方式.

icz*_*cza 7

"最佳"解决方案

我们甚至可以利用以下内容将其写成比其他答案更紧凑:

  • 使用元组赋值
  • 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
}
Run Code Online (Sandbox Code Playgroud)

测试它:

fmt.Printf("%q\n", longestWord(""))
args := "Monday Tuesday Friday Sunday Wednesday"
fmt.Printf("%q\n", longestWord(args))
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

""
"Wednesday"
Run Code Online (Sandbox Code Playgroud)

最紧凑的解决方案

请注意,存储长度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
}
Run Code Online (Sandbox Code Playgroud)

测试和输出是相同的,在Go Playground上试试.同样,在大多数情况下,与我们存储长度时相比,这可能稍微慢一些.