跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

模拟算法精选:替换问号、提莫攻击、Z 字形变换等五题解析

模拟算法精选:替换问号、提莫攻击、Z 字形变换等五题解析。涵盖 LeetCode 1576 至 1419 共五道经典题目,涉及字符串遍历、区间合并、数学规律推导及状态机模型。通过 C++ 代码演示如何高效处理边界条件与逻辑分支,重点讲解替换字符时的邻接判断、中毒时间重叠计算、Z 字形周期性索引映射、外观数列迭代生成以及青蛙叫声的状态流转控制。适合希望提升算法模拟能力与代码细节把控的开发者参考。

数字游民发布于 2026/3/23更新于 2026/5/76 浏览
模拟算法精选:替换问号、提莫攻击、Z 字形变换等五题解析

模拟算法实战:经典题目详解

模拟算法是面试和竞赛中的高频考点,核心在于将问题转化为计算机可执行的步骤。本文选取了五道典型题目,涵盖字符串处理、区间计算、规律推导及状态机模型,通过 C++ 实现展示解题思路。

039 替换所有的问号

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

解法思路

纯模拟遍历。从前往后扫描字符串,遇到 ? 时,尝试用 a~z 的字符替换。关键在于确保替换后的字符不与前后相邻字符重复。

代码实现

class Solution {
public:
    string modifyString(string s) {
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '?') {
                // 尝试 a-z 进行替换
                for (char ch = 'a'; ch <= 'z'; ch++) {
                    // 检查是否与左右邻居冲突
                    if ((i == 0 || ch != s[i - 1]) && 
                        (i == s.size() - 1 || ch != s[i + 1])) {
                        s[i] = ch;
                        break;
                    }
                }
            }
        }
        return s;
    }
};

技术要点:由于只需要避开左右两个字符,而字母表有 26 个,必然存在至少一个可用字符,无需回溯。


040 提莫攻击

题目: LeetCode 495. 提莫攻击

解法思路

模拟中毒过程。核心在于计算两次攻击的时间间隔与中毒持续时间的关系:

  1. 若间隔大于等于持续时间,上次中毒效果完整结算。
  2. 若间隔小于持续时间,则上次中毒被提前打断,只计算实际重叠前的时长。

代码实现

class Solution {
:
    {
         ret = ;
         n = timeSeries.();
         ( i = ; i < n; i++) {
             x = timeSeries[i] - timeSeries[i - ];
             (x >= duration) {
                ret += duration;
            }  {
                ret += x;
            }
        }
        
         ret + duration;
    }
};
public
int findPoisonedDuration(vector<int>& timeSeries, int duration)
int
0
int
size
for
int
1
int
1
if
else
// 最后一次攻击的中毒时间必须完整计入
return

041 Z 字形变换

题目: LeetCode 6. Z 字形变换

解法思路

找规律模拟。观察发现,字符排列以 2 * numRows - 2 为周期循环。第一行和最后一行是公差为该周期的等差数列;中间行每周期包含两个字符,分别位于正向和反向路径上。

代码实现

class Solution {
public:
    string convert(string s, int numRows) {
        if (numRows == 1) return s;
        
        string ret;
        int d = 2 * numRows - 2;
        int n = s.size();
        
        // 1. 处理第一行
        for (int i = 0; i < n; i += d) ret += s[i];
        
        // 2. 处理中间行
        for (int k = 1; k < numRows - 1; k++) {
            for (int i = k, j = d - k; i < n || j < n; i += d, j += d) {
                if (i < n) ret += s[i];
                if (j < n) ret += s[j];
            }
        }
        
        // 3. 处理最后一行
        for (int i = numRows - 1; i < n; i += d) ret += s[i];
        
        return ret;
    }
};

042 外观数列

题目: LeetCode 38. 外观数列

解法思路

递归模拟。第 N 项是对第 N-1 项的描述。需要统计连续相同字符的个数,然后拼接'个数 + 字符'。例如 "1" -> "11" -> "21"。

代码实现

class Solution {
public:
    string countAndSay(int n) {
        string ret = "1";
        for (int i = 1; i < n; i++) {
            string tmp;
            int len = ret.size();
            for (int left = 0, right = 0; right < len;) {
                while (right < len && ret[left] == ret[right]) right++;
                tmp += to_string(right - left) + ret[left];
                left = right;
            }
            ret = tmp;
        }
        return ret;
    }
};

043 数青蛙

题目: LeetCode 1419. 数青蛙

解法思路

状态机模拟。青蛙叫声顺序固定为 c->r->o->a->k。使用哈希表记录当前处于各阶段的青蛙数量。遇到新字符时,检查前驱状态是否有空闲青蛙;若是 'c' 且无 'k' 结束状态的青蛙,则需新增一只。

代码实现

class Solution {
public:
    int minNumberOfFrogs(string croakOfFrogs) {
        string t = "croak";
        int n = t.size();
        vector<int> hash(n);
        unordered_map<char, int> index;
        
        for (int i = 0; i < n; i++) index[t[i]] = i;
        
        for (auto ch : croakOfFrogs) {
            if (ch == 'c') {
                if (hash[n - 1] != 0) hash[n - 1]--;
                hash[0]++;
            } else {
                int i = index[ch];
                if (hash[i - 1] == 0) return -1;
                hash[i - 1]--, hash[i]++;
            }
        }
        
        for (int i = 0; i < n - 1; i++)
            if (hash[i] != 0) return -1;
        
        return hash[n - 1];
    }
};

技术要点:最后需检查所有非结束状态的青蛙计数是否为 0,确保没有未完成的叫声。

目录

  1. 模拟算法实战:经典题目详解
  2. 039 替换所有的问号
  3. 解法思路
  4. 代码实现
  5. 040 提莫攻击
  6. 解法思路
  7. 代码实现
  8. 041 Z 字形变换
  9. 解法思路
  10. 代码实现
  11. 042 外观数列
  12. 解法思路
  13. 代码实现
  14. 043 数青蛙
  15. 解法思路
  16. 代码实现
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 无需公网 IP 安全访问本地 AI 服务的实践方案
  • Spring 事务管理与传播机制详解
  • openTCS WEB 接口实战:从基础调用到自定义指令开发
  • Playwright 与 MCP AI 实现自动化浏览器操作指南
  • 基于 Qwen2.5 与 LLaMA-Factory 的 LoRA 微调实战
  • AMD 显卡加速 Whisper 语音识别:从环境配置到性能优化实战
  • SGI STL 空间配置器原理及 uninitialized 系列函数解析
  • 人工智能与大模型核心技术体系及学习路径指南
  • Java 环境搭建与首个 Hello World 程序实战
  • PyTorch 分布式训练实战:手动 DDP、Accelerate 与 DeepSpeed 对比
  • CMake与Makefile:核心区别与实战指南
  • 基于 Llama-Factory 的 OTA 行程规划微调实践
  • Chatwoot 私有化部署与网页集成实操
  • 30+ 大语言模型(LLM)面试问题及答案详解
  • Web APIs:元素滚动 scroll 系列属性详解(位置与尺寸)
  • AI 产品经理转行大模型指南:核心素质与学习路径
  • HarmonyOS 5.0 端侧 AI 智能工业质检 APP 开发实战
  • Windows 三种网络类型详解及 eNSP 实验防火墙配置方案
  • OpenClaw 的 SOUL.md:用自然语言定义 AI 代理身份与行为边界
  • ClaudeCode 结合 Figma-MCP 实现前端 UI 1:1 还原指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online