目录
一替换所有的问号
二提莫攻击
三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;
else
ret += 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];
}
};
以上便是有关模拟的相关题目:有问题欢迎在评论区指出,谢谢!!