算法笔记(四)——模拟
文章目录
- 算法笔记(四)——模拟
- 替换所有的问号
- 提莫攻击
- 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];}
};