zoukankan      html  css  js  c++  java
  • 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%

  • 相关阅读:
    MySql 常用时间函数
    ORM执行原生SQL语句
    如何获取该变量(对象)是属于什么类型的
    预解析
    全局变量与局部变量
    函数可以作为参数使用,如果一个函数作为参数,那么我们说这个参数(函数)可以叫回调函数。
    函数的自调用,没有名字,声明的同时直接调用
    return之后的代码不执行
    js冒泡排序
    switch-case case后比较是严格模式
  • 原文地址:https://www.cnblogs.com/solskgaer/p/10642571.html
Copyright © 2011-2022 走看看