模拟类题目没有太多的算法和思考,题目会将所有的条件都写明,只需按照题目的要求一一实现即可,但会有很多的细节,这也是这类题目容易失分的原因,模拟类题目的特点就是废话多,题目长,代码繁。
做这类题目,首先要保证读懂题目,否则就直接放弃吧,要先在脑子里想好方案,然后再用代码实现,敲代码前要胸有成竹,另外,要注意细节,捕捉题目中的重点,不要漏条件,这是100分和30分的区别啊。如果你打一道模拟题调了很久都没有结果,那么不如重打,打100多行的代码会比调试100多行的代码快,更容易找出错误。举一例子:
字符串展开
题目大意:根据以下规则展开字符串:
(1)遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号“-”,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右边的字符严格大于左边的字符。
(2)参数p1:展开方式。p1=1时,对于字母子串,填充小写字母;p1=2时,对于字母子串,填充大写字母。这两种情况下数字子串的填充方式相同。p1=3时,不论是字母子串还是数字子串,都用与要填充的字母个数相同的星号“ * ”来填充。
(3)参数p2:填充字符的重复个数。p2=k表示同一个字符要连续填充k个。例如,当p2=3时,子串“d-h”应扩展为“deeefffgggh”。减号两侧的字符不变。
(4)参数p3:是否改为逆序:p3=1表示维持原有顺序,p3=2表示采用逆序输出,注意这时仍然不包括减号两端的字符。例如当p1=1、p2=2、p3=2时,子串“d-h”应扩展为“dggffeeh”。
(5)如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如:“d-e”应输出为“de”,“3-4”应输出为“34”。如果减号右边的字符按照ASCII码的顺序小于或等于左边字符,输出时,要保留中间的减号,例如:“d-d”应输出为“d-d”,“3-1”应输出为“3-1”。
明显的模拟题,条件一应俱全,不用算法,代码实现即可,这道题的读入和输出都很简单,可以展开时直接输出,也可以先存起来再输出,我选择前者。
这道题细节也比较多,首先要判断是否是‘-’,然后注意特殊的:‘-’前后不都是数字或不都是字母,前后相同或前大后小,特判完就展开其他,处理好细节就没问题。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int p1,p2,p3;
string s;
char r,l;
bool chr(char a)//判断是否是字母
{
if(a>='a'&&a<='z')
return true;
else
return false;
}
bool num(char b)//判断是否是数字
{
if(b>='0'&&b<='9')
return true;
else
return false;
}
bool f(char x,char y)//判断前后是否同一类型
{
if(chr(x)&&chr(y))
return true;
if(num(x)&&num(y))
return true;
return false;
}
int main()
{
cin>>p1>>p2>>p3;
cin>>s;
cout<<s[0];
for(int i=1;i<=s.size()-2;i++)//首个字符和最后的字符必不用处理,直接输出,循环次数减2
{
if(s[i]=='-')
{
if(f(s[i-1],s[i+1])&&s[i-1]<s[i+1])//如果前后类型相同则可以展开
{
l=s[i-1];
r=s[i+1];
if(p1==2)//是否需要大写
if(chr(s[i-1]))
{
l=l+'A'-'a';
r=r+'A'-'a';
}
if(p3==1)//顺序输出
{
for(char j=l+1;j<=r-1;j++)
for(int k=1;k<=p2;k++)
if(p1==3)
cout<<'*';
else
cout<<j;
}
else
{
for(char j=r-1;j>=l+1;j--)//逆序输出
for(int k=1;k<=p2;k++)
if(p1==3)
cout<<'*';
else
cout<<j;
}
}
else
cout<<'-';//不是同类型无法展开输出'-'
}
else
cout<<s[i]; //不用进行处理,输出原有字符
}
cout<<s[s.size()-1]<<endl;
return 0;
}