实用性案例 | 算法基础 | 初学者友好
一、案例目标
实现一个程序,接收用户输入的一组整数(使用切片存储),然后找出其中的最大值与最小值,并打印结果。
二、 应用场景举例
- • 数据分析中找出极值(最高温度、最低成绩)
- • 统计程序中的最小成本和最大利润
- • 游戏、金融、监控等场景中的实时指标筛选
三、 涉及知识点
| 知识点 | 说明 |
切片 []int 使用 |
动态数组处理数据序列 |
for 循环遍历 |
遍历每个元素 |
条件判断 if |
判断是否是最大或最小值 |
| 初始值策略 | 设置最大/最小初始值是关键 |
四、🛠 功能需求
- 1. 用户输入一组整数(以空格分隔);
- 2. 将其转换为整数切片;
- 3. 遍历切片,找出最大值与最小值;
- 4. 打印原始切片和结果;
- 5. 处理非法输入(如非数字字符);
五、 完整示例代码
package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func main() { fmt.Println("请输入一组整数(空格分隔):") reader := bufio.NewReader(os.Stdin) input, _ := reader.ReadString('\n') numbers, err := parseInput(input) if err != nil || len(numbers) == 0 { fmt.Println("输入有误,请输入一组有效的整数。") return } fmt.Println("输入的切片:", numbers) max, min := findMaxMin(numbers) fmt.Println("最大值:", max) fmt.Println("最小值:", min) } // 字符串转整数切片 func parseInput(input string) ([]int, error) { fields := strings.Fields(input) var result []int for _, s := range fields { n, err := strconv.Atoi(s) if err != nil { return nil, err } result = append(result, n) } return result, nil } // 查找最大值和最小值 func findMaxMin(nums []int) (int, int) { max := nums[0] min := nums[0] for _, n := range nums { if n > max { max = n } if n < min { min = n } } return max, min }
六、 示例运行
输入示例:
请输入一组整数(空格分隔): 45 3 67 88 12 0 -5 99
输出结果:
输入的切片: [45 3 67 88 12 0 -5 99] 最大值: 99 最小值: -5
七、 核心解析
- 1. 初始化最大/最小值为切片第一个元素:
max := nums[0] min := nums[0]
- 2. 遍历并比较每个元素:
for _, n := range nums { if n > max { max = n } if n < min { min = n } }
- 3. 注意切片为空的情况需提前处理。
八、拓展练习建议
- • 输出最大值和最小值出现的位置(索引);
- • 同时计算平均值;
- • 支持浮点数输入(改用
[]float64); - • 排除负数,只在正数中查找最大值;
- • 将功能封装为通用工具函数供其他模块调用;
九、常见问题
| 问题 | 原因 | 建议解决 |
| 程序 panic 空切片 | 没有输入或未检查长度 | 在调用前判断切片是否为空 |
| 输入字符串报错 | 包含非数字字符 | 提前清洗输入或添加错误提示 |
| 最大最小值为0 | 初始化为0不准确 | 应初始化为切片第一个值 |
小结
本案例是最常见、最实用的遍历算法之一,学习要点包括:
- • 如何从切片中提取信息(极值)
- • 逻辑清晰的比较流程
- • 错误处理与用户输入的解析
这些技巧将在你后续写数据处理、排序、图表可视化、甚至机器学习数据预处理时频繁使用。