蓝桥杯 Java B 组 - 第 1 周复习总结
一、复习本周知识点
1. 主要知识点
✅ 输入输出(Scanner & BufferedReader)
✅ 条件语句(if-else)
✅ 循环语句(for & while)
✅ 数组(Array & ArrayList)
✅ 字符串处理(String & StringBuilder)
✅ 递归(Factorial, Fibonacci, 汉诺塔)
✅ 集合(ArrayList, HashMap, HashSet)
2. 易错点复习
❌ 数组索引越界(IndexOutOfBoundsException)
❌ 字符串拼接性能问题(应使用 StringBuilder)
❌ 递归基准条件未设(导致无限递归)
❌ HashMap 访问不存在的 key(应使用 getOrDefault())
二、综合题:学生成绩管理系统
�� 目标:
- 输入学生姓名和成绩
- 存储数据(ArrayList + HashMap)
- 计算平均分
- 找出最高分、最低分
- 按成绩排序
- 按姓名查询
1. 需求分析
�� 输入:
请输入学生人数:
5
请输入学生姓名和成绩:
Alice 90
Bob 85
Charlie 78
David 92
Eve 88
输出:
平均分:86.6
最高分:92(David)
最低分:78(Charlie)
按成绩排序:
David 92
Alice 90
Eve 88
Bob 85
Charlie 78
请输入查询的学生姓名:
Bob
Bob 的成绩是:85
2. Java 代码
import java.util.*;
public class StudentManager {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 用 HashMap 存储学生信息
HashMap<String, Integer> studentScores = new HashMap<>();
ArrayList<Map.Entry<String, Integer>> sortedList;
// 输入学生成绩
System.out.println("请输入学生人数:");
int n = scanner.nextInt();
scanner.nextLine(); // 处理换行符
System.out.println("请输入学生姓名和成绩:");
for (int i = 0; i < n; i++) {
String name = scanner.next();
int score = scanner.nextInt();
studentScores.put(name, score);
}
// 计算平均分
int sum = 0, maxScore = Integer.MIN_VALUE, minScore = Integer.MAX_VALUE;
String maxStudent = "", minStudent = "";
for (Map.Entry<String, Integer> entry : studentScores.entrySet()) {
int score = entry.getValue();
sum += score;
if (score > maxScore) {
maxScore = score;
maxStudent = entry.getKey();
}
if (score < minScore) {
minScore = score;
minStudent = entry.getKey();
}
}
double avg = (double) sum / studentScores.size();
System.out.printf("平均分:%.2f\n", avg);
System.out.println("最高分:" + maxScore + "(" + maxStudent + ")");
System.out.println("最低分:" + minScore + "(" + minStudent + ")");
// 按成绩排序
sortedList = new ArrayList<>(studentScores.entrySet());
sortedList.sort((a, b) -> b.getValue() - a.getValue());
System.out.println("按成绩排序:");
for (Map.Entry<String, Integer> entry : sortedList) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
// 查询学生成绩
System.out.println("请输入查询的学生姓名:");
String queryName = scanner.next();
if (studentScores.containsKey(queryName)) {
System.out.println(queryName + " 的成绩是:" + studentScores.get(queryName));
} else {
System.out.println("学生不存在!");
}
}
}
3. 代码解析
- 数据存储
- 用 HashMap<String, Integer> 存储 学生姓名 → 成绩
- 遍历计算
- 计算 平均分:sum / size
- 计算 最高分、最低分
- 排序
- ArrayList<Map.Entry<K, V>>
- sort((a, b) -> b.getValue() - a.getValue())
- 查询
- getOrDefault() 处理不存在的情况
三、蓝桥杯集合综合题常考点
考点 | 典型题目 | 常见难点 |
ArrayList 操作 | 存储动态数据 | 删除元素导致索引变化 |
HashMap 统计 | 单词频率、分数统计 | 处理 null 值 |
排序(Lambda) | 成绩排序、字母排序 | List 转换 Map |
数据查询 | 查询学生成绩、查找最大值 | 不存在的 key 处理 |
四、易错点总结
✅ 忽略换行符
scanner.nextLine(); // 避免 nextInt() 影响字符串输入
✅ 直接删除 ArrayList 中的元素
for (int i = list.size() - 1; i >= 0; i--) {
if (list.get(i) == target) {
list.remove(i); // ✅ 正确(倒序删除避免索引错乱)
}
}
✅ 遍历 HashMap
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
五、启发式学习
1. 如何优化数据结构选择?
✅ 如果需要去重:用 HashSet
✅ 如果需要排序:用 TreeMap 或 ArrayList.sort()
✅ 如果需要映射关系:用 HashMap
蓝桥杯 Java B 组 - 第 1 周复习总结
经过 7 天的学习,我们已经掌握了 Java 基础语法、数组与字符串操作、递归与集合框架 等核心知识。这份总结将详细复习本周的 知识点、易错点、经典题目与解法,帮助你巩固学习内容,为后续提升打下坚实的基础!
第 1 天:输入输出(Scanner vs BufferedReader)
知识点
✅ Scanner(适用于小数据量)
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
double b = scanner.nextDouble();
String s = scanner.next(); // 读取一个单词
String line = scanner.nextLine(); // 读取整行
✅ BufferedReader(适用于大数据量)
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = reader.readLine();
int num = Integer.parseInt(line); // 读取并转换
易错点
❌ Scanner.nextInt() 后紧跟 nextLine(),导致读取不到字符串
int a = scanner.nextInt();
String line = scanner.nextLine(); // ❌ 读取的是换行符
✅ 解决方法
scanner.nextLine(); // 先消耗换行符
String line = scanner.nextLine();
经典题目:多组 A+B 问题(EOF 处理)
输入
1 2
3 4
5 6
输出
3
7
11
解法
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
int a = scanner.nextInt();
int b = scanner.nextInt();
System.out.println(a + b);
}
第 2 天:条件语句与循环
知识点
✅ if-else 语句
if (score >= 90) {
System.out.println("优秀");
} else if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
✅ for 循环
for (int i = 1; i <= 10; i++) {
System.out.print(i + " ");
}
✅ while 循环
int i = 1;
while (i <= 10) {
System.out.print(i + " ");
i++;
}
易错点
❌ 忘记循环终止条件,导致死循环
while (true) { // ❌ 没有终止条件,程序无限运行
System.out.println("Hello");
}
经典题目:输出九九乘法表
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + (i * j) + " ");
}
System.out.println();
}
第 3 天:数组(一维数组 & 二维数组)
知识点
✅ 一维数组
int[] arr = {1, 2, 3, 4, 5};
System.out.println(arr[0]); // 访问第一个元素
✅ 二维数组
int[][] matrix = {
{1, 2, 3},
{4, 5, 6}
};
System.out.println(matrix[1][2]); // 输出 6
易错点
❌ 数组越界
int[] arr = new int[5];
System.out.println(arr[5]); // ❌ 抛出异常
经典题目:矩阵转置
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
transposed[j][i] = matrix[i][j];
}
}
第 4 天:字符串处理
知识点
✅ 字符串反转
StringBuilder sb = new StringBuilder("hello");
sb.reverse();
System.out.println(sb.toString()); // olleh
✅ 统计字符出现次数
HashMap<Character, Integer> freq = new HashMap<>();
for (char c : str.toCharArray()) {
freq.put(c, freq.getOrDefault(c, 0) + 1);
}
易错点
❌ 使用 String 拼接导致性能低
String s = "";
for (int i = 0; i < 10000; i++) {
s += "a"; // ❌ O(n^2) 复杂度
}
✅ 正确做法
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append("a"); // ✅ O(n) 复杂度
}
经典题目:判断回文串
String reversed = new StringBuilder(str).reverse().toString();
System.out.println(str.equals(reversed) ? "YES" : "NO");
第 5 天:递归
知识点
✅ 递归求阶乘
public static int factorial(int n) {
return (n == 0 || n == 1) ? 1 : n * factorial(n - 1);
}
✅ 斐波那契数列
public static int fibonacci(int n) {
return (n == 0 || n == 1) ? n : fibonacci(n - 1) + fibonacci(n - 2);
}
易错点
❌ 递归缺少终止条件,导致无限递归
public static int wrong(int n) {
return n * wrong(n - 1); // ❌ 没有终止条件
}
第 6 天:集合(ArrayList & HashMap)
知识点
✅ ArrayList
ArrayList<Integer> list = new ArrayList<>();
list.add(10);
list.remove(0);
System.out.println(list.contains(10)); // false
✅ HashMap
HashMap<String, Integer> map = new HashMap<>();
map.put("Alice", 90);
System.out.println(map.get("Alice")); // 90
易错点
❌ 遍历 HashMap 方式错误
for (String key : map.keySet()) {
System.out.println(key + ": " + map.get(key));
}
经典题目:统计单词频率
for (String word : words) {
wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
}
第 7 天:综合练习
题目:学生成绩管理系统
- 录入学生姓名 & 成绩(HashMap)
- 计算平均分、最高分、最低分
- 按成绩排序
- 查询学生成绩
✅ 掌握 HashMap + ArrayList.sort() 处理数据
蓝桥杯考试技巧
✅ 先做简单题,确保基本分
✅ 使用 Scanner.hasNext() 处理不定输入
✅ 用 StringBuilder 而不是 String 拼接
✅ 递归一定要有终止条件
✅ 遍历 HashMap 用 entrySet()