目录
一替换所有的问号
二提莫攻击
三N字形变换
四外观数列
五数青蛙
一替换所有的问号
oj链接:替换所有的问号
思路:简单模拟;注意i==0和i==n是处理越界问题就行!!
class Solution
{
public:string modifyString(string s){int n = s.size();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 s;}
};
二提莫攻击
oj链接:提莫攻击
思路:模拟 + 找规律
1.先计算出timeSeries两者之间的差值:x,会有两种情况:
a.如果x>=duration:中毒时间不会被重置
b.如果x<duration: 中毒时间要重置,加上x即可,会不会在重置具体看后面
最后return时要把timeSerise[n-1]的中毒时间给加上!!
class Solution
{
public:int findPoisonedDuration(vector<int> &timeSeries, int duration){int n = timeSeries.size(), ret = 0;for (int i = 1; i < n; i++){int x = timeSeries[i] - timeSeries[i - 1];if (x >= duration)ret += duration;elseret += x;}return ret + duration; // 最后的中毒时间要加上}
};
三N字形变换
oj链接:N字形变换
思路:
解法1:开辟空间来模拟填表:用flag进行标记;
a.如果是第一行:flag为正数,往下进行填表
b.如果是最后一行:falg为负数,往上进行填表
解法2:找规律
//解法1:模拟
class Solution {
public:string convert(string s, int numRows) {if(numRows<2) return s;int n=s.size();vector<string> v(numRows);int i=0,flag=-1;//flag是关键!//用flag进行填表for(auto& e:s){v[i].push_back(e);if(i==0||i==numRows-1) flag=-flag;i+=flag;}string ret;for(auto& e:v){ret+=e;}return ret;}
};//解法2:找规律
class Solution {
public:string convert(string s, int numRows) {if(numRows==1) return s;int n=s.size(),d=2*numRows-2;string ret;for(int i=0;i<numRows;i++){//填第一行与最后一行if(i==0||i==numRows-1){int j=i;while(j<n){ret+=s[j];j+=d;}}//中间行时要注意越界else{int j=i,r=d-i;//不确定是那个先越界while(j<n || r<n){if(j<n) ret+=s[j];if(r<n) ret+=s[r];j+=d;r+=d;} }}return ret;}
};
四外观数列
oj链接:外观数列
思路:模拟(统计前面字符出现的个数即可)
class Solution {
public:string countAndSay(int n) {string ret="1";for(int i=2;i<=n;i++){string ret1;for(int i=0;i<ret.size();i++){int cnt=1;//统计个数while(i+1<ret.size()&&ret[i]==ret[i+1]) cnt++,i++;ret1+=to_string(cnt);ret1+=ret[i];}ret=ret1;}return ret;}
};
五数青蛙
oj链接:数青蛙
思路:模拟:遍历字符串;要用hash表储存进行遍历过程中字符个数
a.如果遇到c之后的字符:r,o,a,k:判断前驱字符:c,r,o,a是否为0
如果为0,直接return -1
不为0,前驱字符--,当前字符++;
b.如果遇到c字符,只要判断字符k是否为0
如果为0,c字符++;
如果不为0,c字符++,k字符--;
遍历完成后,要再次进行对k之前的字符个数进行判断是否为0:
如果其中一个的字符个数不为0:return -1
如果没有:return 最少青蛙的个数,即:k字符的个数
class Solution {
public:int minNumberOfFrogs(string croakOfFrogs) {string s="croak";int n=s.size();vector<int> hash(n);//数组模拟哈希表,数组下标对应字符unordered_map<char,int> index;//【字符,字符对应的下标】进行查找字符对应的下标(辅助)for(int i=0;i<n;i++) index[s[i]]=i;for(auto& ch:croakOfFrogs){if(ch=='c'){//看看k字符的情况if(hash[n-1]) 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]; }
};
以上便是有关模拟的相关题目:有问题欢迎在评论区指出,谢谢!!