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 關注
- 174 瀏覽
添加回答
舉報