用go语言找工作,秋招笔试过程中遇到的常见的输入场景...
- 1. 输入t行数据,每行都是两个数字a, b
- 2. 第一行输入一个数字t,代表接下来有t行,每行n个数字,n是不固定的
- 3. 每行输入第一个数字n,后面再输入n个数字,生成一个长度为n的数组,n为0的时候停止。
- 4. 无确定行数,输入多行数组,每行存成一个数组。
- 5. 输入多行字符串,每行n个字符,字符间用空格分隔(“ ”),或以“,”分隔
- 6. 第一行输入一个数字,第二行输入一行字符串,对应输出一个结果
- 7. 第一行输入一行数字(不固定个数) 第二行输入一个数字 inputs, _, _ := r.ReadLine()
- 8. 第一行输入m和n两个数字,代表m行n列的矩阵,接下来输入m行,每行n个数字。
- 9. 如果不知道矩阵的m和n,
- 最后,查到的跳出Scan的for循环的方法,
1. 输入t行数据,每行都是两个数字a, b
package main
import (
"fmt"
)
func main() {
var t, a, b int
fmt.Scanln(&t)
for i := 0; i < t; i++ {
fmt.Scanln(&a, &b)
fmt.Println(a + b)
}
}
2. 第一行输入一个数字t,代表接下来有t行,每行n个数字,n是不固定的
import "fmt"
func main() {
var t, n, a int
var res [][]int
fmt.Scan(&t)
for i := 0; i < t; i++ {
fmt.Scan(&n)
nums := []int{}
for j := 0; j < n; j++ {
fmt.Scan(&a)
nums = append(nums, a)
}
fmt.Println(nums)
res = append(res, nums)
}
fmt.Println(res)
}
3. 每行输入第一个数字n,后面再输入n个数字,生成一个长度为n的数组,n为0的时候停止。
func main() {
var n, a int
for {
fmt.Scan(&n)
if n == 0 {
break
}
arr := []int{}
for i := 0; i < n; i++ {
fmt.Scan(&a)
arr = append(arr, a)
}
fmt.Println(arr) // 这里调用自己的解题函数
}
}
4. 无确定行数,输入多行数组,每行存成一个数组。
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
inputs := bufio.NewScanner(os.Stdin)
for inputs.Scan() {
nums1 := []int{}
data := strings.Split(inputs.Text(), " ")
for i := range data {
val, _ := strconv.Atoi(data[i]) // string转成int
nums1 = append(nums1, val)
}
fmt.Println(nums1)
}
}
5. 输入多行字符串,每行n个字符,字符间用空格分隔(“ ”),或以“,”分隔
func main() {
input := bufio.NewScanner(os.Stdin)
for input.Scan() {
// 提示用空格分隔,才能正确提取出输入字符或字符串,否则输入时的空格也被提取出来了
strs := strings.Split(input.Text(), " ") // strs是个[]string类型, 以空格分隔
fmt.Printf("%v, %T\n", strs, strs) // [sd ard], []string
fmt.Printf("%v, %T\n", strs[0], strs[0]) // sd, string
fmt.Println(strs)
strj := strings.Join(strs, " ") // 将[]string -> string类型
fmt.Println(strj) // sd ard
}
}
6. 第一行输入一个数字,第二行输入一行字符串,对应输出一个结果
// fmt.Scan 视换行符为空白字符
// fmt.Scanln 遇到换行符停止扫描
func main() {
var n int
fmt.Scanln(&n) // 这里注意fmt.Scan和fmt.Scanln的区别
input := bufio.NewReader(os.Stdin)
bytes, _, _ := input.ReadLine()
s := string(bytes)
res := solve(s) // 这里调用自己的解题函数
fmt.Println(res)
}
7. 第一行输入一行数字(不固定个数) 第二行输入一个数字 inputs, _, _ := r.ReadLine()
func main() {
var nums []int
var a int
r := bufio.NewReader(os.Stdin)
inputs, _, _ := r.ReadLine() // 这里的inputs是[]byte类型
input := string(inputs) // 转成string类型
data := strings.Split(input, " ") // 以空格分隔,转成[]string
for i := range data {
val, _ := strconv.Atoi(data[i]) // string -> int, 注意返回值是两个
nums = append(nums, val)
}
fmt.Scan(&a)
fmt.Println(nums)
fmt.Println(a)
}
8. 第一行输入m和n两个数字,代表m行n列的矩阵,接下来输入m行,每行n个数字。
func main() {
var m, n int
fmt.Scanln(&m, &n)
res := make([][]int, m) // m行
for i := range res {
res[i] = make([]int, n) // n列
}
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
fmt.Scan(&res[i][j])
}
}
fmt.Println(res)
fmt.Println(m, n)
}
9. 如果不知道矩阵的m和n,
这种写法就是不知道什么时候跳出for循环…
func main() {
var num [][]int
for {
reader := bufio.NewReader(os.Stdin)
strBytes, _, _ := reader.ReadLine()
str := strings.Fields(string(strBytes))
var arr []int
for i := range str {
n, _ := strconv.Atoi(str[i])
arr = append(arr, n)
}
num = append(num, arr)
fmt.Println(num)
}
}
最后,查到的跳出Scan的for循环的方法,
package main
import (
"bufio"
"os"
)
func main() {
input := bufio.NewScanner(os.Stdin)
for input.Scan() {
indata := input.Text()
if indata == "quit" {
break
}
}
}