Java 中“模拟算法”(Simulation / Ad-hoc / Brute Force 类题目)是蓝桥杯、省赛、ACM 入门、LeetCode 中等偏下难度、Codeforces Div.3/Div.4 A~C 题最常见的类型。
这类题目的核心特点:
- 没有明显的经典数据结构/算法模板(如二分、DP、图论)
- 题目直接描述了一个过程/规则/小游戏/日期推进/字符串变换等
- 需要严格按照题目描述一步一步模拟,往往涉及循环、条件判断、计数、状态转移
- 容易边界爆炸(输入范围很大时要优化模拟方式)
- 时间复杂度通常是 O(n) ~ O(n log n) 或更高,但 n ≤ 10^5~10^6 居多
模拟题的常见子类型(带代表性题目)
| 子类型 | 核心技巧 | LeetCode / 力扣经典题(Java实现友好) | Codeforces / AtCoder 典型难度 | 蓝桥杯/省赛出现频率 |
|---|---|---|---|---|
| 日期/时间模拟 | 日历计算、闰年、星期推算 | 1154. 一年中的第几天 1360. 日期之间隔几天 | 800–1400 | ★★★★★ |
| 字符串/字符变换 | 逐字符处理、进位、模拟加法 | 6. Z 字形变换 43. 字符串相乘 415. 字符串相加 | 1000–1600 | ★★★★☆ |
| 游戏/规则模拟 | 轮流操作、状态机、贪心选择 | 877. 石子游戏 1140. 石子游戏 II 2028. 找出缺失的观测数据 | 1200–1800 | ★★★★☆ |
| 队列/栈模拟过程 | 用数组/队列模拟多轮操作 | 402. 移掉 K 位数字 946. 验证栈序列 | 1200–1700 | ★★★☆☆ |
| 矩阵/棋盘模拟 | 方向数组、边界判断、染色 | 463. 岛屿的周长 733. 图像渲染 289. 生命游戏 | 1100–1600 | ★★★★☆ |
| 进制/位运算模拟 | 模拟二进制加法、进位、位翻转 | 67. 二进制求和 989. 数组形式的整数加法 | 1000–1500 | ★★★☆☆ |
| 计数/统计过程 | 多轮累加、差分思想优化 | 1942. 最小未被占据椅子的编号 846. 一手顺子 | 1300–1800 | ★★★★☆ |
| 模拟大数/高精度 | String / int[] 模拟加减乘除 | 415. 字符串相加 43. 字符串相乘 | 1400–2000 | ★★☆☆☆ |
推荐的 Java 模拟练习进阶路径(2026 年建议顺序)
| 阶段 | 目标 | 题目数量 | 推荐平台 & 题单 | 难度范围 | 时间建议 |
|---|---|---|---|---|---|
| 1 | 建立模拟感觉 | 30–50 | LeetCode 标签「模拟」Easy + Medium 前 30 | 800–1400 (CF) | 1–2 周 |
| 2 | 掌握常见套路 | 80–120 | 力扣「模拟」+ 蓝桥杯历年省赛 A/B 组模拟题 | 1200–1700 | 3–5 周 |
| 3 | 边界与优化 | 50–80 | Codeforces Div.3/Div.4 A~C + AtCoder Beginner C~D | 1400–1900 | 持续刷 |
| 4 | 高难度模拟 | 30–60 | Codeforces Div.2 A~C + AtCoder Regular C~E 中偏模拟题 | 1800–2200+ | 长期积累 |
几道高质量模拟题(带 Java 关键点提示,建议手写)
- LeetCode 289. 生命游戏(经典棋盘模拟)
- 关键:用位运算或额外状态压缩空间(原地修改)
- Java 注意:二维数组边界判断、深拷贝 vs 原地
- LeetCode 885. 螺旋矩阵 III(方向模拟 + 步长递增)
- 关键:方向数组 {0,1,0,-1} {1,0,-1,0},步长 1,1,2,2,3,3…
- 容易错:越界判断顺序
- 蓝桥杯典型题 – 日期问题(回文日期、星期几)
- 常用代码模板:闰年判断 + 天数累加 + Zeller 公式
static boolean isLeap(int y) {
return (y % 4 == 0 && y % 100 != 0) || y % 400 == 0;
}
static int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
- Codeforces 风格 – 模拟队列操作 / 多轮游戏
- 例:有 n 个人排队,每轮第 k 个人离开,求最后剩下的人
- 用 ArrayDeque 或 LinkedList 模拟(Java 推荐 Deque)
- 字符串模拟加法 / 乘法(大数加法模板)
public String addStrings(String num1, String num2) {
StringBuilder sb = new StringBuilder();
int carry = 0, i = num1.length() - 1, j = num2.length() - 1;
while (i >= 0 || j >= 0 || carry > 0) {
int sum = carry;
if (i >= 0) sum += num1.charAt(i--) - '0';
if (j >= 0) sum += num2.charAt(j--) - '0';
sb.append(sum % 10);
carry = sum / 10;
}
return sb.reverse().toString();
}
给你一个快速自测清单(建议 7 天内做完)
| 难度顺序 | 题目(LeetCode编号 / 搜索关键词) | 预计编码时间 | 考察重点 |
|---|---|---|---|
| Easy | 434. 字符串中的单词数 | 8–12 min | 边界(多个空格、首尾空格) |
| Easy–Medium | 67. 二进制求和 | 12–18 min | 进位、补0对齐 |
| Medium | 6. Z 字形变换 | 20–35 min | 找规律 / 模拟数组 |
| Medium | 43. 字符串相乘 | 30–50 min | 大数乘法(可拆成加法) |
| Medium | 289. 生命游戏 | 25–40 min | 原地修改 + 状态压缩 |
| Medium–Hard | 885. 螺旋矩阵 III | 35–60 min | 方向 + 步长控制 |
| Hard(挑战) | 829. 连续整数求和(数学模拟)或 2028. 找出缺失的观测数据 | 40–90 min | 多重约束模拟 |
重阳,你现在最想从哪一类开始练?
- 日期/时间类(蓝桥杯最爱)
- 字符串/大数模拟
- 矩阵/棋盘/方向模拟
- 游戏规则/多轮过程模拟
- 还是想要一套 20 道 Java 模拟题的进阶清单?
告诉我你的偏好或目标(蓝桥杯?省赛?LeetCode 冲分?Codeforces Div.2?),我可以给你更精准的题目 + 代码框架 + 易错点提醒~