如何找到阵列中最长的字符串?

-1

实际上我可以使用Go语言中的两个循环来完成它,例如,如果我有数组:

["aa", "aab", "bcd", "a", "cdf", "bb"]
Run Code Online (Sandbox Code Playgroud)

我需要使用maxLength返回字符串.所以输出将是:

["aab", "bcd", "cdf"]
Run Code Online (Sandbox Code Playgroud)

这就是我在做什么.

package main

import "fmt"

func allLongestStrings(inputArray []string) []string {
    maxLength := len(inputArray[0])
    outputArray := []string{}
    for _, value := range inputArray {
        if len(value) > maxLength {
            maxLength = len(value)
        }
    }
    for _, val := range inputArray {
        if len(val) == maxLength {
            outputArray = append(outputArray, val)
        }
    }
    return outputArray
}

func main() {
    xs := []string{"aa", "aab", "bcd", "a", "cdf", "bb"}
    fmt.Println(allLongestStrings(xs))
}
Run Code Online (Sandbox Code Playgroud)

是否可以在一个循环中执行此操作,因为我运行相同的循环两次以查找长度并在outputArray中追加字符串.

提前致谢.

Cer*_*món 6

试试这个:

func allLongestStrings(inputArray []string) []string {
    max := -1 // -1 is guaranteed to be less than length of string
    var result []string
    for _, s := range inputArray {
        if len(s) < max {
            // Skip shorter string
            continue
        }
        if len(s) > max {
            // Found longer string. Update max and reset result.
            max = len(s)
            result = result[:0]
        }
        // Add to result
        result = append(result, s)
    }
    return result
}
Run Code Online (Sandbox Code Playgroud)

正如peterSO在另一个答案中指出的那样,结果切片可以具有大于所需的容量,并且可以包含超过切片长度的字符串值.在某些上下文中,额外的分配和字符串引用可能是个问题(结果会保留很长时间,字符串很大,......).如果分配和引用是一个问题,则返回切片副本.

func allLongestStrings(inputArray []string) []string {
    ...
    return append([]string(nil), result...)
}
Run Code Online (Sandbox Code Playgroud)

如果函数可以改变原始切片,则可以在输入切片中构造函数结果.这避免了结果切片的分配.

func allLongestStrings(inputArray []string) []string {
    n := 0
    max := -1
    for i, s := range inputArray {
        if len(s) < max {
            // Skip shorter string
            continue
        }
        if len(s) > max {
            // Found longer string. Update max and reset result.
            max = len(s)
            n = 0
        }
        inputArray[n], inputArray[i] = inputArray[i], inputArray[n]
        n++
    }
    return inputArray[:n]
}
Run Code Online (Sandbox Code Playgroud)