這題最開始的想法就是用一個map來解決問題:
func main() {
num := 0
fmt.Scan(&num)
a := 0
b := 0
m := make(map[int]int)
for i := 0; i < num; i++ {
fmt.Scan(&a)
fmt.Scan(&b)
m[a] += b
}
for k, v := range m {
fmt.Printf("%d %d\n", k, v)
}
}
然而很可惜,Go的Map沒有排序功能,不像Java可以直接用TreeMap來解決問題。因此上面的方法是錯的。後來我想了想,其實可以利用數組,令下標爲key,那麼就能實現有序了。因此,我寫出了第二版程序:
package main
import "fmt"
func main() {
num := 0
fmt.Scan(&num)
a := 0
b := 0
arr := make([]int, 11111112)
for i := 0; i < num; i++ {
fmt.Scan(&a)
fmt.Scan(&b)
arr[a] += b
}
for i, v := range arr {
if v != 0 {
fmt.Printf("%d %d\n", i, v)
}
}
}
這樣的判定就正確了,但是問題又來了,時間上太久了:
Java版本的才100ms,Go竟然要60ms,這實際上是因爲數組太大了導致的。爲了解決這個問題,還需要引入一個Map:
- 將所有的輸入保存到Map中
- 將key保存到一個數組中
- 數組排序
- 遍歷數組,用數組中的元素訪問之前的Map
新的代碼是這樣的:
package main
import (
"fmt"
"sort"
)
func main() {
num := 0
fmt.Scan(&num)
a := 0
b := 0
m := make(map[int]int)
for i := 0; i < num; i++ {
fmt.Scan(&a)
fmt.Scan(&b)
m[a] += b
}
var arr []int
for k := range m {
arr = append(arr, k)
}
sort.Ints(arr)
for _, v := range arr {
fmt.Printf("%d %d\n", v, m[v])
}
}