本文档为《Go 语言入门 100 题》系列的第三题,内容涉及编写一个程序来统计给定整数中的每一位数字出现次数。题目难度为中等,旨在帮助初学者掌握基本编程技巧和算法逻辑。通过此练习,学习者能够加深对 Go 语言语法及标准库的理解与应用。
### Go 语言入门题目解析:个位数统计
#### 题目背景与目标
本题目选自《Go 语言入门 100 题》,编号为 L1-003,难度评级为 15 分。题目要求实现一个程序来统计一个不超过 1000 位的大整数中各个不同个位数出现的频率,并按照数字从小到大的顺序输出这些个位数及其出现次数。
#### 输入输出要求
**输入格式:**
- 每个测试用例由一行不超过 1000 位的正整数组成。
**输出格式:**
- 对于每个不同的个位数字 D,输出该数字及其在输入中的出现次数 M,格式为 `D:M`。
- 输出按照数字 D 的升序排列。
**示例:**
- **输入样例:** `100311`
- **输出样例:**
```
0:2
1:3
3:1
```
#### 解题思路
1. 将输入的大整数视为字符串,便于逐个字符地处理。
2. 使用 Go 语言中的 `map` 数据结构来存储每个个位数及其出现次数。这里使用 `rune` 类型作为键(Go 语言中用于表示单个字符的数据类型),因为大整数可能包含多位数字,而每个数字由单个字符表示。
3. 创建一个新的整型数组来存储实际出现的个位数字。
4. 使用 Go 语言中的排序函数对包含实际出现的个位数的数组进行排序,并按照排序后的顺序输出。
#### 实现代码
```go
package main
import (
fmt
sort
)
func main() {
var str string
k := make(map[rune]int) // 初始化 map 以存储个位数及其出现次数
_, _ = fmt.Scan(&str)
for _, item := range str {
k[item]++
}
keys := make([]int, 0, len(k))
for k1 := range k {
keys = append(keys, int(k1)) // 将实际出现的个位数字添加到整型数组中
}
sort.Ints(keys)
for _, item := range keys {
fmt.Printf(%d:%d\n, item, k[rune(item)])
}
}
```
### 代码解析
1. **初始化 Map**:使用 `make` 函数初始化 `map[rune]int` 类型的 `k`,其中 `rune` 表示字符,`int` 表示该字符的出现次数。
2. **读取输入**:使用 `fmt.Scan` 从标准输入读取字符串。
3. **遍历字符串并统计**:使用 `for` 循环遍历字符串中的每个字符,并更新 `map` 中对应的值。
4. **创建并填充整型数组**:遍历 `map` 的键,将实际出现的个位数字添加到整型数组 `keys` 中。
5. **排序**:使用 `sort.Ints()` 对 `keys` 进行排序。
6. **输出结果**:再次遍历排序后的 `keys` 数组,并使用 `fmt.Printf` 打印每个个位数字及其出现次数。
通过以上步骤,我们能够有效地解决这个统计问题,并且符合题目要求的格式输出结果。