算法刷题笔记:模拟题从入门到实战(含 LeetCode 例题与习题)

1. 讲解

是什么?

模拟题的本质是 比葫芦画瓢,即按照题目给定的规则和步骤,直接转化为代码实现。

  • 题目通常会描述一个具体的场景或流程(如Z字形变换、螺旋矩阵、数青蛙等)

  • 不需要复杂的算法思想(如动态规划、贪心),只需忠实模拟每一步操作

  • 特点:思路比较简单,但细节往往比较繁琐

什么时候用?

当题目直接描述了一个可以通过固定规则推演的过程时,就可以考虑使用模拟。

适用条件通常包括:

  • 题目给出了明确的状态转移规则或操作步骤

  • 不需要复杂的数据结构或高级算法优化

  • 容易在实现过程中遗漏边界条件或特殊情况

怎么用?

模拟题的通用解题步骤:

  1. 纸上模拟 先在演草纸模拟一遍流程,走通题目的逻辑,否则极其容易忽略掉细节。

  2. 转化为代码 将纸上推演的步骤一步一步翻译为代码,注意变量边界和循环条件。

  3. 优化(找规律) 模拟题想要优化,99.9%都是靠找规律来的。

    • 画图:找规律的时候,最好就是把原始的模拟结果画出来(比如把矩阵画出来)

    • 反推:根据画出来的最终结果去反推规律(如推导下标公式)

    • 验证:当推出来一个规律后,再换一种情况来验证一下这个规律是否正确

    • 兜底 :同时考虑是否有特殊情况需要单独考虑(如 numRows == 1 等边界情况)

例题讲解:

我们以LeetCode的替换所有的问号为例

1. 题目描述

给你一个仅包含小写英文字母和 '?' 字符的字符串 s,请你将所有的 '?' 转换为若干小写字母,使最终的字符串不包含任何连续重复 的字符。你不能修改非 '?' 字符。

示例 1:

复制代码
 输入:s = "?zs"
 输出:"azs"
 解释:该示例共有 25 种解决方案。只有 "z" 是无效的,因为字符串 "zzs" 中有连续重复的两个 'z'。

2. 解析与代码演化

  • 第一步:纸上推演 从前往后扫描数组,当遇到 ? 时,就用 a~z 依次尝试,直到找到一个字符放在 ? 的位置,使得它和它前面一个字母不同和后面一个字母也不同。

    细节:在开头仅需判断和后面一个字母是否相同;在结尾仅需判断和前面一个字母是否相同即可。

  • 第二步:代码实现(基础版,尝试 a~z)

java 复制代码
class Solution {
     public String modifyString(String ss) {
         char[] s = ss.toCharArray();
         int n = s.length;
         for (int i = 0; i < n; i++) {
             if (s[i] == '?') { // 替换
                 for (char ch = 'a'; ch <= 'z'; ch++) {
                     // 利用短路特性避免数组越界
                     if ((i == 0 || ch != s[i - 1]) && (i == n - 1 || ch != s[i + 1])) {
                         s[i] = ch;
                         break; // 找到就退出循环
                     }
                 }
             }
         }
         return String.valueOf(s);
     }
 }
  • 第三步:优化(尝试 a~c)
java 复制代码
class Solution {
     public String modifyString(String ss) {
         char[] s = ss.toCharArray();
         int n = s.length;
         for (int i = 0; i < n; i++) {
             if (s[i] == '?') { // 替换
                 for (char ch = 'a'; ch <= 'c'; ch++) { // 优化:只需尝试 a,b,c
                     if ((i == 0 || ch != s[i - 1]) && (i == n - 1 || ch != s[i + 1])) {
                         s[i] = ch;
                         break;
                     }
                 }
             }
         }
         return String.valueOf(s);
     }
 }
总结
  • 模拟题是思路最简单 但细节最繁琐的题型,适合作为基础训练

  • 解题核心在于:纸上推演 -> 转换代码 -> 处理边界

  • 模拟题的优化捷径是找规律 ,找规律的关键在于画图反推 -> 多情况验证 -> 考虑特殊情况

  • 时间复杂度从暴力模拟的 O(n²) 或 O(n*m) 优化至 O(n) 或 O(1)

2. 习题

替换所有的问号

题目链接:1576.替换所有的问号

提莫攻击

题目链接:495.提莫攻击

外观数列

题目链接:38.外观数列

数青蛙

题目链接:1419.数青蛙

相关推荐
文丑颜不良啊几秒前
LeetCode1161~1180题目解析
java·leetcode
古法老登瞎折腾8 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
飞Link8 小时前
什么是 AirSim?一文读懂无人机仿真平台
python·算法·无人机
智能运维指南9 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
yz_aiks10 小时前
Spring AI 2.1 ChatMemory 已过时用什么替代:迁移到 Session Memory 实战(JDBC 存储与会话压缩)
java·spring boot·大模型·ai agent·spring ai
金銀銅鐵10 小时前
[Java] 用 GUI 展示 EnumMap 增删键值对时的内部变化
java·后端·ai编程
学长毕设10 小时前
基于SpringBoot的上门洗车服务系统设计与实现
java·spring boot·后端
jason成都10 小时前
RTKLIB-Java 多基线联合RTK:FIX率从0%到91.5%的三层根因修复
java·gnss·rtklib·rtklib_java
鱼宵10 小时前
Stream 终端操作一次讲透:collect、count、reduce 怎么选
java·stream·终端操作
一去不复返的通信er10 小时前
贪心算法-合并区间(LeetCode 56)
算法·leetcode·贪心算法