当前位置: 首页 > news >正文

算法笔记(四)——模拟

算法笔记(四)——模拟

文章目录

  • 算法笔记(四)——模拟
  • 替换所有的问号
  • 提莫攻击
  • Z字形变换
  • 外观数列
  • 数青蛙

模拟算法就是根据题目的要求,题目让干神马就做神马,一步一步来

替换所有的问号

题目:替换所有的问号

在这里插入图片描述

思路

  • 从左到右遍历整个字符串,找到问号之后,就⽤ a ~ z 的每⼀个字符去尝试替换

C++代码

class Solution 
{
public:string modifyString(string s) {for(int i = 0; i < s.size(); i ++){if(s[i] == '?'){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;}
};

提莫攻击

题目:提莫攻击

在这里插入图片描述
思路

  • 遍历数组当前位置减去前一个位置, 如果差值
  • 大于中毒时长,就加上中毒时间
  • 如果小于,就加上差值
  • 最后,加上最后一次中毒时间

C++代码

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

Z字形变换

题目:Z字形变换

在这里插入图片描述
思路

  • 如果横着看,就是数学法,找通项公式;
  • 如果竖着看,在按列读取的时候,为每一行维护一个字符串,读到哪一行就在后面追加字符
  • 设置两个边界,在增长到或者减小到某个边界的时候,读取行的顺序进行反转,不断地从上到下,再从下到上读取,直到取完所有字串
class Solution 
{
public:string convert(string s, int numRows) {if(numRows == 1) return s;vector<string> rows(numRows);int i = 0;int flag = -1;for(auto ch : s){rows[i].push_back(ch);if(i == 0 || i == numRows - 1){flag = -flag;}i += flag;}string res;for(auto x : rows) {res += x;}return res;}
};

外观数列

题目:外观数列

在这里插入图片描述
思路
模拟 + 双指针,模拟实现
C++

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 l = 0, r = 0; r < len; ){while(r < len && ret[l] == ret[r]) r++;tmp += to_string(r - l) + ret[l];l = r;}ret = tmp;}return ret;}
};

数青蛙

题目:数青蛙

在这里插入图片描述

思路

  • 模拟将c、r、o、a、k存入哈希表;
  • 遍历字符串,
  • 如果遇到c,找最后一个字符,即k是否在哈希表中存在,若存在最后一个字符,即k--,当前字符,即c++
  • 遇到其他字符,若其前驱存在,前驱个数--,当前++;若不存在,返回-1

C++代码
纯暴力

class Solution 
{
public:int minNumberOfFrogs(string croakOfFrogs) {int hash[5]={0};int n = croakOfFrogs.size();for(int i = 0;i < n;i++){if(croakOfFrogs[i] == 'c'){if(hash[4] > 0){hash[4]--;hash[0]++;}else hash[0]++;}else if(croakOfFrogs[i] == 'r'){if(hash[0] > 0){hash[0]--;hash[1]++;}else return -1;}else if(croakOfFrogs[i] == 'o'){if(hash[1]>0){hash[1]--;hash[2]++;}else return -1;}else if(croakOfFrogs[i] == 'a'){if(hash[2] > 0){hash[2]--;hash[3]++;}else return -1;}else if(croakOfFrogs[i] == 'k'){if(hash[3] > 0){hash[3]--;hash[4]++;}else return -1;}else return -1;}if(hash[0]||hash[1]||hash[2]||hash[3]) return -1;return hash[4]; }
};

借助unordered_map

class Solution 
{
public:int minNumberOfFrogs(string croakOfFrogs) {string t = "croak";int n = t.size();vector<int> hash(n);unordered_map<char, int> mp = {{'c', 0}, {'r', 1}, {'o', 2}, {'a', 3}, {'k', 4}};for(auto ch : croakOfFrogs){if(ch == 'c'){if(hash[n - 1] != 0) hash[n - 1]--;hash[0]++;  }else{int i = mp[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];}
};

http://www.mrgr.cn/news/41058.html

相关文章:

  • 天呐!关于PyCharm你竟然一无所知?
  • [Linux]开发环境搭建
  • (笔记)第三期书生·浦语大模型实战营(十一卷王场)--书生入门岛通关第2关Python 基础知识
  • DAY84服务攻防-端口协议桌面应用QQWPS 等 RCEhydra 口令猜解未授权检测
  • Yocto - 使用Yocto开发嵌入式Linux系统_05 认识Bitbake工具
  • 计算机视觉算法:全面深入的探索与应用
  • 【内存池】——解决传统内存分配的弊端
  • 王道数据结构代码讲解
  • 一文彻底搞懂多模态 - 基础术语+基础知识+多模态学习
  • 网页前端开发之Javascript入门篇(3/9):条件控制
  • 操作系统错题解析【软考】
  • [MAUI]数据绑定和MVVM:MVVM的属性验证
  • 2024 全新体验:国学心理 API 接口来袭
  • 交换机如何开启FTP服务
  • 电商店铺多开自动回复软件
  • 【递归】11. leetcode 129 求根节点到叶节点数字之和
  • 高效论文写作指南:那些你必须知道的工具与平台
  • 基于SSM的大学生心理素质测评及咨询平台系统设计与实现(源码+定制+讲解)
  • Java高效编程(9):优先使用 try-with-resources 而非 try-finally**
  • QT系统学习篇(3)- Qt开发常用算法及控件原理