实际上我可以使用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中追加字符串.
提前致谢.
试试这个:
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)
| 归档时间: |
|
| 查看次数: |
1576 次 |
| 最近记录: |