• hello, 博客园


    在注册了博客园帐号不知道多久之后,我终于开始写自己的第一篇博客了,因为我终于意识到,我的记忆力真的跟我自己想象中差别太大了,很多东西看过去可能几周甚至几天的时间就忘记了。
    今天要写的是关于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%

  • 相关阅读:
    iOS中使用nil NULL NSNULL的区别
    Xcode常用快捷键总结
    (求租仓库)navigationController .navigationBar 的属性设置
    imageNamed 与 initWithContentsOfFile 区别
    iOS-Senior10-多线程(子线程创建)
    iOS-setValue和setObject的区别
    iOS-Senior8-网络之进阶
    iOS-Senior7-数据请求
    iOS-Senior6-数据解析(JSON)
    iOS-Senior6-数据解析(XML)
  • 原文地址:https://www.cnblogs.com/solskgaer/p/10642571.html
Copyright © 2020-2023  润新知