Golang在OJ系统上的坑-输入相关

用Golang刷OJ,虽然很奇怪,但作为蒟蒻,为了笔试和面试也只能硬着头皮刷了,然后就碰到了一堆奇怪的问题。

这篇主要讲输入的一些坑。

首先,我们知道读取控制台输入可以用fmt包或者bufio包,这里尽量不要用fmt的Scan(也包括Scanf,Scanln等等),虽然用法和c的Scanf差不多,但是效率低太多,多调用几次就TLE的节奏。推荐使用bufio.NewScanner,一般来说绝大部分的题目用这个就够了。但是,bufio.NewScanner的底层buf数组有个最大缓存限制的,是64K,也就是说按照标准的Scan,一行最多64K的数据大小,题目里如果超过这个范围,比如一行20万数据,每个数据范围还是int32内的,那这就至少800K的大小了,还没算上中间的空格,所以默认的buf空间肯定是不够的,这时候需要调用Buffer方法,手动给Scanner分配一个满足题目空间的buf数组,其余照常。(当然,除了这种方法,还可以用bufio的NewReader,调用ReadString方法,可以完整地读取一行,而不必考虑一行的长度,因为底层帮忙做了处理)

附个题目:https://www.acwing.com/problem/content/description/105/

以及AC代码:

package main
import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
	"strings"
)
func main() {
	sc := bufio.NewScanner(os.Stdin)
	bs := make([]byte, 2000*1024)
	sc.Buffer(bs, len(bs))
	sc.Scan()
	N, _ := strconv.Atoi(sc.Text())

	repo := make(map[int]int, N)
	sc.Scan()
	l := strings.Split(sc.Text(), " ")
	for _, s := range l {
		v, _ := strconv.Atoi(s)
		repo[v]++
	}
	sc.Scan()
	M, _ := strconv.Atoi(sc.Text())
	movie := make([][3]int, M)
	sc.Scan()
	l = strings.Split(sc.Text(), " ")
	for i, s := range l {
		movie[i][0], _ = strconv.Atoi(s)
		movie[i][2] = i+1
	}
	sc.Scan()
	l = strings.Split(sc.Text(), " ")
	for i, s := range l {
		movie[i][1], _ = strconv.Atoi(s)
	}
	sort.Slice(movie, func(i, j int) bool {
		if repo[movie[i][0]] == repo[movie[j][0]] {
			return repo[movie[i][1]] > repo[movie[j][1]]
		} else {
			return repo[movie[i][0]] > repo[movie[j][0]]
		}
	})
	fmt.Println(movie[0][2])
}

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值