OJ(牛客网)输入输出练习 golang实现

目录导读

这个文章主要是我找工作的一些随笔,因为在笔试过程中经常需要自己搞定输入输出,这个如果不会有思路也无法搞定,因此在这里写下这个blog来为后来者一些借鉴,减少走弯路的概率。

此外,这个练习可以基于牛客的一个竞赛进行练习,我都是基于这里的题目来练习,后来者们可参考一下我的代码,并自己敲一遍(实践很重要!)

A+B(1)

package main  // 包名, 必需的,因为这里就是相当于一个go文件

import (  // 调用的包
    "fmt"
    "io"
)

func main() {
    var a, b int
    for { // 循环获取输入
        if _, err := fmt.Scan(&a,&b); err != io.EOF {
            fmt.Println(a + b)
        } else {
            break
        }
    }
}

// 注: Scan从标准输入扫描文本,将成功读取的空白分隔的值保存进成功传递给本函数的参数。换行视为空白。返回成功扫描的条目个数和遇到的任何错误。如果读取的条目比提供的参数少,会返回一个错误报告原因
// 后面如果没有必要,比如说第二题,我不会获取对应的`n,err` , 直接用起来的(就是假定输入都是正确的不会进行特别处理)

A+B(2)

package main

import "fmt"

func main() {
    var t, a, b int
    fmt.Scan(&t) // 
    for t > 0 {
        fmt.Scan(&a, &b)
        fmt.Println(a + b)
        t--
    }
}
// 如果是正常的业务开发的话,是需要获取err并进行处理的
// 业务处理的形式 后面题目不会写这种形式的,因为笔试有时间限制的
func main() {
    var t, a, b int
    if _, err := fmt.Scan(&t); err != nil {
        // 处理错误
        return
    } 
    for t > 0 {
        if _, err := fmt.Scan(&a, &b); err != nil {
        	// 处理错误
        	return
    	} 
        fmt.Println(a + b)
        t--
    }
}

A+B(3)

package main

import "fmt"

func main() {
    var a, b int
    for {
        fmt.Scan(&a, &b)
        if a == 0 && b == 0 {
            break
        }
        fmt.Println(a + b)
    }
}

A+B(4)

package main

import "fmt"

func main() {
    var n, num int
    for {
        fmt.Scan(&n)
        if n == 0 {
            break
        }
        sum := 0
        for n > 0 {
            fmt.Scan(&num)
            sum += num
            n--
        }
        fmt.Println(sum)
    }
}

// 当然这个题可以使用bufio包来做,也就是读入一行数据再进行处理

package main

import (  
    "fmt"
    "os"
    "bufio"
    "strings"
    "strconv"
)


func main() {
    input := bufio.NewScanner(os.Stdin) //创建并返回一个从os.Stdin读取数据的Scanner
    for input.Scan(){ 
        // Scan方法获取当前位置的token(该token可以通过Bytes或Text方法获得),
        // 并让Scanner的扫描位置移动到下一个token。当扫描因为抵达输入流结尾或者遇到错误而停止时,本方法会返回false
        nums := strings.Split(input.Text(), " ") //分割字符串
        if nums[0] == "0" { // 判断是否结束
            break
        }
        res := 0
        for i := 1; i < len(nums); i++ {
            num, _ := strconv.Atoi(nums[i]) // 字符串转数字
            res += num
        }
        fmt.Println(res)
    }
}

A+B(5)

package main

import (
    "fmt"
)

func main() {
    var t, n, num int
    fmt.Scan(&t)
    for ; t > 0; t-- {
        fmt.Scan(&n)
        res := 0
        for ; n > 0; n-- {
            fmt.Scan(&num)
            res += num
        }
        fmt.Println(res)
    }
}

// 当然这个题可以使用bufio包来做,也就是读入一行数据再进行处理

package main

import (  
    "fmt"
    "os"
    "bufio"
    "strings"
    "strconv"
)


func main() {
    input := bufio.NewScanner(os.Stdin)
    input.Scan()
    t, _ := strconv.Atoi(input.Text())
    for ; t > 0; t-- { 
        input.Scan()
        nums := strings.Split(input.Text(), " ")
        res := 0
        for i := 1; i < len(nums); i++ {
            num, _ := strconv.Atoi(nums[i])
            res += num
        }
        fmt.Println(res)
    }
}

A+B(6)

// 这个直接用bufio做比较方便
package main

import (  
    "fmt"
    "os"
    "bufio"
    "strings"
    "strconv"
)

func main() {
    input := bufio.NewScanner(os.Stdin)
    for input.Scan() { 
        nums := strings.Split(input.Text(), " ")
        res := 0
        for i := 1; i < len(nums); i++ {
            num, _ := strconv.Atoi(nums[i])
            res += num
        }
        fmt.Println(res)
    }
}

// 当然, fmt。Sacn也可以做, 与第一道题类似的判断就是了
package main

import (
    "fmt"
    "io"
)

func main() {
    var n, num int
    for {
        if _, err := fmt.Scan(&n); err != io.EOF {
            res := 0
            for ; n > 0; n-- {
                fmt.Scan(&num)
                res += num
            }
            fmt.Println(res)
        } else {
            break
        }
    }
}

A+B(7)

// 这个直接用bufio做好,因为这题没有指定数组的大小了, 这种情况用fmt.Scan我还没想到,有做出来的大佬们可以告诉我一下!感谢
package main

import (  
    "fmt"
    "os"
    "bufio"
    "strings"
    "strconv"
)

func main() {
    input := bufio.NewScanner(os.Stdin)
    for input.Scan() { 
        nums := strings.Split(input.Text(), " ")
        res := 0
        for i := 0; i < len(nums); i++ {
            num, _ := strconv.Atoi(nums[i])
            res += num
        }
        fmt.Println(res)
    }
}

字符串排序(1)

package main

import (  
    "fmt"
    "os"
    "bufio"
    "strings"
    "sort"
)


func main() {
    input := bufio.NewScanner(os.Stdin)
    input.Scan() // 去掉第一行
    input.Scan() // 获取第二行
    str := strings.Split(input.Text(), " ") // 字符串分割
    sort.StringSlice.Sort(str) // 字符串排序,这里借助了sort.StringSlice方法来实现
    fmt.Println(strings.Join(str, " ")) // 通过Join来连接, 也可以手动连接
    // 手动连接代码形式
    res := ""
    for _, v := range str {
        res += " " + v 
    }
    fmt.Println(res[1:]) // 去掉前导空格
}

字符串排序(2)

package main

import (  
    "fmt"
    "os"
    "bufio"
    "strings"
    "sort"
)


func main() {
    input := bufio.NewScanner(os.Stdin)
    for input.Scan() {
        str := strings.Split(input.Text(), " ") // 字符串分割
        sort.StringSlice.Sort(str) // 字符串排序,这里借助了sort.StringSlice方法来实现
        fmt.Println(strings.Join(str, " ")) // 通过Join来连接, 也可以手动连接
    }
}

字符串排序(3)

// 这个跟上面的一样,只不过分割符变成了 "," 而已
package main

import (  
    "fmt"
    "os"
    "bufio"
    "strings"
    "sort"
)


func main() {
    input := bufio.NewScanner(os.Stdin)
    for input.Scan() {
        str := strings.Split(input.Text(), ",") // 字符串分割
        sort.StringSlice.Sort(str) // 字符串排序,这里借助了sort.StringSlice方法来实现
        fmt.Println(strings.Join(str, ",")) // 通过Join来连接, 也可以手动连接
    }
}

其实综上所述,好像是使用bufio直接读取一行比较方便,但是这里可依据题目要求自行选择比较合适的方法,没有最好的,只有合不合适的,此外,在我的代码中使用了多个包,有些包以及包含的函数方法我在这里没有很详细地讲解,在这里放上我常用的一个Go的一个API中文文档链接,大家有啥不懂的可以自行查查。

上一篇:【STM32H7的DSP教程】第38章 STM32H7的FIR高通滤波器实现(支持逐个数据的实时滤波)


下一篇:航电oj:All in Allb