【牛客刷題】HJ8 合併表記錄

題目鏈接

這題最開始的想法就是用一個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])
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章