关于用Go做一些OJ时遇到的问题

关于用Go做一些OJ时遇到的问题

总体上来说oj还是适合用c/c++来做,因为很多oj对他们输入样例处理很完善,但是对于小众语言Go来说,却不是那么好,或者来说,处理输入的方法有点麻烦;
另外吐槽这种输入输出恶心人的oj网站,也许是最近刷leetcode习惯了不处理输入输出的oj。

  • 在牛客网的OJ输入上,经常出现问题
  1. 多组数据输入,一定处理fmt.Scanln()的返回值,具体处理方式见下:

    ...
    n,err:=fmt.Scanln()
    if n==0||err!=nil{
    	return //或者break等,结束输入
    }
    

    问题来源:多组数据下,明明按照它要求的输入输出实现,但还是遇到0.00%通过的问题;多组数据下,明明按照它要求的输入输出实现,但还是遇到0.00%通过的问题;
    解决:这多半还是Go的输入上造成的,并且Go没有C/C++的EOF控制方式,所以只能通过fmt.Scanln()返回的参数判断,具体看如下代码。

    package main
    import "fmt"
    func main(){
    	n:=0
    	_,_=fmt.Scanln(&n)//一般不太愿意再处理其返回的两个参数
    	for n>0{
    		a:=0
    		for n>2{
    			a+=n/3;n=n%3+n/3
    			if n==2{
    				n++
    			}
    		}
    		fmt.Println(a)
    		b,err:=fmt.Scanln(&n)
    		//该题因为有明确的停止条件,n==0,所以也没处理其返回值,这样本地测试的所有数据都对,但是放到oj上,一个样例也通不过;
    		//无心加上处理,就通过了!!!真想骂牛客网对小语言的输入处理!垃圾!
    		if b==0||err!=nil{
    			break
    		}
    	}
    }
    
  2. 一行输入中含有多个数据,即有多个空格分割的输入
    这也是Go的输入不像C scanf函数返回EOF结束的处理方式,会造成处理上的麻烦,如下解决方法

    import "bufio"
    ...
    reader:=bufio.NewReader(os.Stdin)
    n,err:=reader.ReadString("\n")
    if n==0||err!=nil{
    	return
    }
    bytes, _, _ := reader.ReadLine() //处理多行时,注意一下返回值的处理
    str := string(bytes)
    fmt.Println(bytes)
    fmt.Println(str)
    

你可能感兴趣的:(关于用Go做一些OJ时遇到的问题)