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中文文档链接,大家有啥不懂的可以自行查查。
标签:OJ,Scan,res,fmt,golang,牛客,bufio,input,main 来源: https://blog.csdn.net/aron_conli/article/details/113462234