【算法百题】专题六_模拟

devtools/2025/3/19 20:11:54/

文章目录

  • 前言
  • 题目:
    • 038. [替换所有的问号(easy)](https://leetcode.cn/problems/replace-all-s-to-avoid-consecutive-repeating-characters/description/)
      • 分析
    • 039. [提莫攻击(easy)](https://leetcode.cn/problems/teemo-attacking/description/)
      • 分析
    • 040. [N 字形变换(medium)](https://leetcode.cn/problems/zigzag-conversion/description/)
      • 分析
    • 041. [外观数列 (medium)](https://leetcode.cn/problems/count-and-say/description/)
      • 分析
    • 042. [数⻘蛙(medium)](https://leetcode.cn/problems/minimum-number-of-frogs-croaking/description/)
      • 分析
  • 总结


前言

模拟算法,顾名思义,就是一种直接按照问题描述的步骤和规则进行逐步操作的解题方法.它不依赖复杂的数学推导或数据结构优化,而是忠实还原题目要求的处理流程,通过一步步执行指令来解决问题.模拟算法大部分考察的是代码能力.

其核心在于:
​流程还原:将题目中的操作步骤转化为代码逻辑。
状态跟踪:维护当前问题的状态(如字符串、数组等),并按照规则更新状态。
​无需优化:以直观方式实现,不追求效率,确保正确.

我本人见的大部分模拟题好像都无可优化(或资历尚浅吧).

模拟算法好像有点像暴力解法?模拟算法是否就是暴力算法?
模拟算法是直接按题目规则逐步构造解,而暴力算法是尝试所有可能,再验证正确性.
相比之下模拟算法更像是模拟人的思路.

所以模拟算法,其实不是,也无需从暴力解法优化而来,尝试按照问题描述的步骤和规则进行逐步操作解题.

在这里插入图片描述


题目:

038. 替换所有的问号(easy)

分析

按照题目要求,一步步构建解.

class Solution {
public:string modifyString(string s) {for(int i = 0;i < s.size();i++){char& ch = s[i];if(ch == '?'){for(char chr = 'a';chr <= 'z';chr++){if(((i == 0) || chr != s[i-1]) && ((i == s.size() - 1) || chr != s[i+1])){ch = chr;break;}}}}return s;}
};

039. 提莫攻击(easy)

分析

按照题目要求,一步步构建解.

class Solution {
public:int findPoisonedDuration(vector<int>& timeSeries, int duration) {int n = timeSeries.size();int ret = 0;for(int i = 0;i < n;i++){if(i != n-1){if(timeSeries[i + 1] - timeSeries[i] > duration) ret += duration;else ret += timeSeries[i + 1] - timeSeries[i];}else{ret += duration;}}return ret;}
};

040. N 字形变换(medium)

分析

在这里插入图片描述

class Solution {
public:string convert(string s, int numRows) {int n = s.size();if(numRows >= n || numRows == 1) return s;          //如果行数大于串的总大小或者等于1,其Z字变换后的字符串还是s.int t = numRows * 2 - 2;                                  //算出2/3个Z字,周期需要的字符数,为了算出最后构造的二维数组需要多少列.int numColumns = (t + n - 1)/t * (numRows - 1);           //(t + n - 1)/t算出周期数,(r-1)是一个周期需要的列数.vector<string> mat(numRows,string(numColumns,0));   //以列做横,方便后续取非0字符.int x = 0,y = 0;for(int i = 0;i<n;i++){mat[x][y] = s[i];if(i % t < numRows - 1)                               //判断每个周期中其内部有没有到达Z字的转折点.{x++;}else{x--;y++;}}string ret;for(auto& arr : mat){for(auto& c : arr){if(c) ret += c;           //不可以c!='0'做条件,还有很多其他值为"假值".}}return ret;}
};

041. 外观数列 (medium)

分析

在这里插入图片描述

class Solution {
public:string countAndSay(int n) {string s = "1";while(--n){string tmp = "";int left = 0,right = 0;while(right < s.size()){if(s[right] != s[left]){tmp += to_string(right - left);tmp += s[left];left = right;}right++;}tmp += to_string(right - left);tmp += s[left];s = tmp;}return s;}
};

042. 数⻘蛙(medium)

分析

在这里插入图片描述

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

总结

因为模拟算法的特性,边界情况是重点.


本文章为作者的笔记和心得记录,顺便进行知识分享,有任何错误请评论指点:)。


http://www.ppmy.cn/devtools/168430.html

相关文章

K8S之QoS详解

Pod QoS 类 服务质量&#xff08;Quality of Service&#xff0c;QoS&#xff09;类&#xff0c; 阐述 Kubernetes 如何根据为 Pod 中的容器指定的资源约束为每个 Pod 设置 QoS 类。Kubernetes 依赖这种分类来决定当 Node 上没有足够可用资源时要驱逐哪些 Pod。 QoS 类&#…

【css酷炫效果】纯CSS实现黑白电视故障雪花

【css酷炫效果】纯CSS实现黑白电视故障雪花 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492002 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&…

独立部署DeepSeek 大语言模型(如 DeepSeek Coder、DeepSeek LLM)可以采用什么框架?

DeepSeek 大语言模型&#xff08;如 DeepSeek Coder、DeepSeek LLM&#xff09;&#xff0c;独立部署这些模型可以采用以下几种框架&#xff1a; 1. Hugging Face Transformers 特点 易用性高&#xff1a;提供了丰富的预训练模型接口&#xff0c;对于 DeepSeek 模型&#xff…

SpringBoot 和vue前后端配合开发网页拼图10关游戏源码技术分享

今天分享一个 前后端结合 的网页游戏 开发项目源码技术。 这也是我第一次写游戏类的程序&#xff0c;虽然不是特别复杂的游戏&#xff0c;但是是第一次写&#xff0c;肯定要记录一下了&#xff0c;哈哈。 游戏的内容 就是 我们显示中玩的那个 拼图碎片的 游戏&#xff0c;类似下…

Ubuntu 软件仓库管理概述与基本原理

Ubuntu 软件仓库管理概述与基本原理 在 Ubuntu 系统中,软件仓库(Repository)充当着软件包的集中存储地,就好比一个庞大的在线应用市场,里面包含了各种经过测试的软件包。利用软件仓库,用户无需手动下载和安装软件,只需要通过简单的命令,系统就会自动处理依赖关系,完成…

BERT系列模型

BERT系列模型 1 BERT模型介绍 1.1 BERT简洁 BERT是2018年10月由Google AI研究院提出的一种预训练模型. BERT的全称是Bidirectional Encoder Representation from Transformers.BERT在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩: 全部两个衡量指标上全面超越人类, …

Leetcode 刷题笔记1 单调栈part01

leetcode 739 每日温度 对于单调栈问题&#xff0c;我觉得是在循环外部增加一些辅助项减少时间复杂度&#xff0c;但增加内存空间的利用 class Solution:def dailyTemperatures(self, temperatures: List[int]) -> List[int]:ans [0] * len(temperatures)stack []for i …

Redis常用数据类型和使用常见以及基本操作举例(适合初学者,以医药连锁管理系统为背景)

Redis的常见数据类型&#xff0c;包括String、Hash、List、Set、Zset等&#xff0c;这些数据类型都有各自的特点和适用场景。接下来&#xff0c;将这些数据类型与医药连锁管理系统的业务场景进行匹配。 String类型&#xff0c;适合存储单个值。在医药连锁管理系统中&#xff0…