在注册了博客园帐号不知道多久之后,我终于开始写自己的第一篇博客了,因为我终于意识到,我的记忆力真的跟我自己想象中差别太大了,很多东西看过去可能几周甚至几天的时间就忘记了。
今天要写的是关于Golang的,在某个OJ刷题的时候发现,自己写的golang代码几乎每一次都超时了,于是每次都不得不换C重写,起初以为是golang的io效率太低了,后来发现别人提交的golang代码甚至可以运行的比C更快,刚好这个OJ支持查看别人提交的代码,于是有机会查看了一下大神们的代码,才发现自己对golang的了解实在浅薄,golang的学习任重而道远。
在一个非常简单的问题中(由于过于简单就不写描述了),我的实现代码是这样的:
package main
import "fmt"
func main(){
var arrlen, numquery int
fmt.Scanf("%d", &arrlen)
fmt.Scanf("%d", &numquery)
arr := make([]int, arrlen)
for i := range arr{
fmt.Scanf("%d", &arr[i])
}
for ; numquery > 0; numquery--{
var op int
fmt.Scanf("%d", &op)
if op == 0{
var l, r int
fmt.Scanf("%d", &l)
fmt.Scanf("%d", &r)
if arr[r-1] == 0{
fmt.Println("EVEN")
}else{
fmt.Println("ODD")
}
}else if op == 1{
var x int
fmt.Scanf("%d", &x)
arr[x-1] = 1-arr[x-1]
}
}
}
代码的逻辑没有问题,但是几乎每一个测试用例都超时超过100%,大神的代码是这样的
package main
import (
"bufio"
"io/ioutil"
"os"
)
var t byte
var inp []byte
var loc, max int
func main() {
var i int64
read := bufio.NewReader(os.Stdin)
inp, _ = ioutil.ReadAll(read)
max = len(inp)
write := bufio.NewWriter(os.Stdout)
n := scanInt()
q := scanInt()
arr := make([]int64, n)
for i = 0; i < n; i++ {
arr[i] = scanInt()
}
for q > 0 {
c := scanInt()
if c == 0 {
scanInt()
r := scanInt()
if arr[r-1] == 0 {
write.WriteString("EVEN
")
} else {
write.WriteString("ODD
")
}
} else {
x := scanInt()
if arr[x-1] == 1 {
arr[x-1] = 0
} else {
arr[x-1] = 1
}
}
q--
}
write.Flush()
}
func scanInt() (res int64) {
t = inp[loc]
for ; t < 48 || t > 57; t = inp[loc] {
loc++
if loc >= max {
break
}
}
for ; t >= 48 && t <= 57; t = inp[loc] {
res = (res << 1) + (res << 3) + int64(t-48)
loc++
if loc >= max {
break
}
}
return
}
把本应成为瓶颈的io加上缓冲,效率提高了90%