3 回答
TA贡献1871条经验 获得超8个赞
我会做类似下面的事情;
func TwoOldestAges(ages []int) (oldest [2]int) {
sort.Sort(sort.Reverse(sort.IntSlice(ages)))
copy(oldest[:], ages)
return
}
这里的工作示例
我为返回参数添加了一个名称,这样您就不必指定您在函数中创建的数组大小。由于数组的最大大小为 2,因此副本只会将前两个结果放入数组中。因此,我们对您的年龄进行排序(按升序排序),然后将其反转,以便两个最高的结果是前两个键。
现在,如果您愿意,您可以更新要返回的数组的大小,而无需更新方法内的任何内容。
编辑: 我可能还应该提到这也可以保护您免受超出范围的索引的恐慌。例如,如果你只通过一个长度/容量为1的切片,如果你依赖,ages[:-2]你很可能会遇到越界恐慌:
恐慌:运行时错误:切片超出范围 [:2] 容量为 1
TA贡献1848条经验 获得超2个赞
我是新手,我猜你可以创建一个固定大小为2的数组,然后将切片的前两个值复制到数组中
s := []int{1, 2, 3}
var twoElements [2]int
//copy the first two values of slice into the entirety of the array
copy(twoElements[:],s[:2]) //copy returns an int of the elements copied
从去文档:
复制内置函数将元素从源切片复制到目标切片。(作为一种特殊情况,它还将字节从字符串复制到字节片。)源和目标可能重叠。Copy 返回复制的元素数量,它将是 len(src) 和 len(dst) 的最小值。
TA贡献1773条经验 获得超3个赞
Go 旨在鼓励高效的代码。由于排序,您的算法是 O(n log n)。更好的算法是 O(n)。
例如,O(n),
package main
import (
"fmt"
)
func TwoOldestAges(ages []int) [2]int {
var old [2]int
for _, age := range ages {
if old[0] < age {
old[1] = old[0]
old[0] = age
} else if old[1] < age {
old[1] = age
}
}
return old
}
func main() {
ages := []int{1, 99, 42, 7, 66, 77}
fmt.Println(ages)
oldest := TwoOldestAges(ages)
fmt.Println(oldest)
ages = []int{1, 77, 42, 7, 66, 99}
fmt.Println(ages)
oldest = TwoOldestAges(ages)
fmt.Println(oldest)
}
游乐场: https: //play.golang.org/p/rq4SMS3MRqY
输出:
[1 99 42 7 66 77]
[99 77]
[1 77 42 7 66 99]
[99 77]
- 3 回答
- 0 关注
- 124 浏览
添加回答
举报