Java模拟算法题目练习

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–50LeetCode 标签「模拟」Easy + Medium 前 30800–1400 (CF)1–2 周
2掌握常见套路80–120力扣「模拟」+ 蓝桥杯历年省赛 A/B 组模拟题1200–17003–5 周
3边界与优化50–80Codeforces Div.3/Div.4 A~C + AtCoder Beginner C~D1400–1900持续刷
4高难度模拟30–60Codeforces Div.2 A~C + AtCoder Regular C~E 中偏模拟题1800–2200+长期积累

几道高质量模拟题(带 Java 关键点提示,建议手写)

  1. LeetCode 289. 生命游戏(经典棋盘模拟)
  • 关键:用位运算或额外状态压缩空间(原地修改)
  • Java 注意:二维数组边界判断、深拷贝 vs 原地
  1. LeetCode 885. 螺旋矩阵 III(方向模拟 + 步长递增)
  • 关键:方向数组 {0,1,0,-1} {1,0,-1,0},步长 1,1,2,2,3,3…
  • 容易错:越界判断顺序
  1. 蓝桥杯典型题 – 日期问题(回文日期、星期几)
  • 常用代码模板:闰年判断 + 天数累加 + 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};
  1. Codeforces 风格 – 模拟队列操作 / 多轮游戏
  • 例:有 n 个人排队,每轮第 k 个人离开,求最后剩下的人
  • 用 ArrayDeque 或 LinkedList 模拟(Java 推荐 Deque)
  1. 字符串模拟加法 / 乘法(大数加法模板)
   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编号 / 搜索关键词)预计编码时间考察重点
Easy434. 字符串中的单词数8–12 min边界(多个空格、首尾空格)
Easy–Medium67. 二进制求和12–18 min进位、补0对齐
Medium6. Z 字形变换20–35 min找规律 / 模拟数组
Medium43. 字符串相乘30–50 min大数乘法(可拆成加法)
Medium289. 生命游戏25–40 min原地修改 + 状态压缩
Medium–Hard885. 螺旋矩阵 III35–60 min方向 + 步长控制
Hard(挑战)829. 连续整数求和(数学模拟)或 2028. 找出缺失的观测数据40–90 min多重约束模拟

重阳,你现在最想从哪一类开始练?

  • 日期/时间类(蓝桥杯最爱)
  • 字符串/大数模拟
  • 矩阵/棋盘/方向模拟
  • 游戏规则/多轮过程模拟
  • 还是想要一套 20 道 Java 模拟题的进阶清单?

告诉我你的偏好或目标(蓝桥杯?省赛?LeetCode 冲分?Codeforces Div.2?),我可以给你更精准的题目 + 代码框架 + 易错点提醒~

文章已创建 4357

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部