go在算法题中的标准输入读取(附相关算法题)

众所周知,算法题中经常需要处理输入与输出的情况。一般存在以下三种情况,即固定数量字符输入,循环输入,单行输入的情况。

1. 循环输入

  • 示例:
for {
		var str string
		n, _ := fmt.Scan(&str)
		if n == 0 {
			break
		}
}
// 使用fmt.Scan()时,必须确保输入长度固定,并使用相应变量接收
for {
		var str string
		_, _ = fmt.Scan(&str)
}		
package main

import (
    "fmt"
)

func main() {
	for {
		var str string
		n, _ := fmt.Scan(&str)
		if n == 0 {
			break
		}

		for len(str) > 8 {
			fmt.Println(str[:8])
			str = str[8:]
		}

		// go生成连续重复字符还要用到for循环,真是糟心
		var s string
		for i := 0; i < 8 - len(str); i++ {
			s = s + "0"
		}
		fmt.Println(str + s)
	}
}

2. 固定长度输入

package main

import (
	"fmt"
	"sort"
)

// //通过map键的唯一性去重
func RemoveRepeatElement(nums []int) []int {
	result := make([]int, 0)
	m := make(map[int]bool) // map的值不重要
	for _, v := range nums {
		if _, ok := m[v]; !ok {
			result = append(result, v)
			m[v] = true
		}
	}
	return result
}

func main()  {
	for {
		// 记录输入数据个数
		var n int
		_, _ = fmt.Scanf("%d", &n)
		if n <= 0 {
			break
		}

		// 添加数据到切片中
		var slice []int
		for i := 0; i < n; i++ {
			var num int
			_, _ = fmt.Scanf("%d", &num)
			slice = append(slice, num)
		}
		ret := RemoveRepeatElement(slice) // 去重
		sort.Ints(ret)

		for _, v := range ret {
			fmt.Println(v)
		}
	}
}

3. 读取不定长输入

package main

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

func main() {
	// 读取标准输入
	inputReader := bufio.NewReader(os.Stdin)  // 返回一个读取器实例Reader
	input, err := inputReader.ReadString('\n') // 按照分隔符读取内容
	if err != nil {
		fmt.Println("输入错误")
	}

	if len(input) == 0 {
		fmt.Println(0)
	}

	strs := strings.Fields(input) // 按照空格分割字符串
	fmt.Println(len(strs[len(strs) - 1]))
}

版权声明:本文为ceshell原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。