尝试使用句子中的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)) }
但我不确定这是实现这一目标的最佳方法.还有其他优雅的方法吗?我知道使用sort还有一种方法,但我更喜欢使用单词之间的迭代方式.
“最佳”解决方案
我们甚至可以利用以下内容将其写成比其他答案更紧凑:
>使用元组分配
>使用零值(“”和0)初始化最佳值和长度,并省略检查0个字符作为范围正确处理
>不需要将单词存储为局部变量,因为它仅在循环中使用
我们失去了可读性:
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"
最紧凑的解决方案
请注意,存储最佳长度是可选的,纯粹是为了优化目的,因为如果我们有最好的,它的长度总是len(最好).
利用这个,并且我们可以使用命名结果参数(并且所有变量都被初始化为其类型的zero value,除非提供初始值 – 对于字符串是“”),我们甚至可以将它写得更紧凑失去可读性:
func longestWord(s string) (best string) { for _," ") { if len(word) > len(best) { best = word } } return }
测试和输出是相同的,在Go Playground上尝试.再次,在大多数情况下,与我们存储长度时相比,这可能稍微慢一点.