参考了 这篇博客 ,原作者也在acwing中,思路是跟他学的,做了一点点增量,原作者看到后如果觉得雷同,算我抄你
代码中肯定有需要改进和优化的地方,求轻喷……
解决过2次go超时,为什么是2次呢?
第一次
- 第796题. 子矩阵的和
之前一直使用fmt.Scanf作为输入,然后在遇到测试用例量比较大的时候就会tle,逐渐暴露scanf的缺点。
在网上一顿爆搜之后看到了第一行的那篇博客,比较懒就用了bufio.NewReader里面的readString方法,于是按行读数据的方法第一版出现。
var reader *bufio.Reader
func readline() ([]int, error){
str, err:=reader.ReadString('\n')
str = str[:len(str)-1]
if len(str)==0||err!=nil{
return nil, errors.New("stdin read error.\n")
}
l := strings.Split(str, " ")
res := make([]int, 0)
for _, s := range l {
x, _ := strconv.Atoi(s)
res = append(res, x)
}
return res, nil
}
func main(){
reader =bufio.NewReader(os.Stdin)
x, _ := readline()
// ...处理x即可
}
然后就ac了,美好的一天。
但是!
这个代码有很大的问题,就是关于eof的处理,它是以读到回车为结束的,不认识eof。我在做下一道题的时候,基本测试用例中最后一行没有回车,导致最后一行的数据就是读不进去(解决这个问题的方法也很简单,就是手动在测试用例最后一行加个回车,但是,毕竟不能每道题都这么加)
请教了一下大佬,大佬建议用scanner,也就是第一行的博客中使用的做法,回到了原点。
第二版代码!
var scanner *bufio.Scanner
func readline() []int{
scanner.Scan()
l := strings.Split(scanner.Text(), " ")
res := make([]int, 0)
for _, s := range l {
x, _ := strconv.Atoi(s)
res = append(res, x)
}
return res
}
func main(){
scanner = bufio.NewScanner(os.Stdin)
bs := make([]byte, 2000*1024)
scanner.Buffer(bs, len(bs))
x, _ := readline()
// 处理x即可
}
第二次
本以为,我本以为上次本以为后就不会再有本以为
又超时了!
scanner也救不了你!
- 第798题 差分矩阵
算法ok,scanner也ok,就是超时
目光逐渐猥琐,转移到fmt.Printf()上,这道题是要输出一个矩阵,相当于调用了n * m次Printf函数,感觉就是你了
这次就没有模板代码了,就是把一行要输出的先转成字符串,再存到一个数组里面,用strings.Join函数合并为一个字符串,只用Printf一次这个字符串即可。
大致这么个意思
for i:=1; i<=n; i++{
y := make([]string, m)
for j:=1; j<=m; j++{
b[i][j] += b[i-1][j] + b[i][j-1] - b[i-1][j-1]
y[j-1] = strconv.Itoa(b[i][j])
}
fmt.Println(strings.Join(y, " "))
}
稀里糊涂的就ac了
总之就是这2次了,不要再有第三次了!
建议使用C++!
肯定有很多问题和要改进的地方,欢迎留言讨论,共同学习共同提高!
2020.6.27更新
KMP那道题更新了数据规模,然后我的代码就tle了
然后又更新了代码
还是更新的golang的IO操作
1. readline()
func readline() int{
scanner.Scan()
x, _ := strconv.Atoi(scanner.Text())
return x
} // 如果这行只有一个数字
func readline1() string{
scanner.Scan()
return scanner.Text()
} // 如果这一行就只有一个字符串
2. int to string
strconv.FormatInt(int64(i-n), 10) // 这个我查到的10进制数字转字符串最快的方式
然后就又ac了
ps
如果数据规模的行数较小,建议在readline里面做操作,每格式化出一个数字就直接处理就行了,而不是把数字格式化成一个数组传出来再遍历,这样明显会慢而且没必要
我有时候都在想,我转golang是不是对的
写的很赞, 多谢帮助。
golang里面 scanner 在bufio 包里, 提供了对缓存读写的优化。
不客气 又更新了一部分 共同学习~