一、题目链接
二、注意点
这道题想法不错,就是太坑,挖的坑多,给的样例又太简单,这就造成了本题得分率高,全对率极低,可以看到这道题提交48.65k次,AC对只有13.83k,说明基本上一个人交四次才能对。这个正确率远低于其它同考察点的题。
这道题其实就考察范围就是选择结构,你甚至可以不用数组来做。但是本题解用到了数组。
本文题解还是用自顶向下的编程思想,将填充字符单独写了一个函数,这样可以方便调试,也使程序结构清晰。为了方便修改填充的字符,以使得分支结构尽量简化,用一个Stl里的vector来存储填充字符(做题时遇到分支结构一定要尽可能地去想着进行简化,否则太绕容易出错,而且费脑子,有时宁愿多无脑多打一些代码,也不要在分支结构上想来想去,因为脑力还要留给后面的难题)。在处理填充字符的转置问题时,用到了algorithm库的reverse函数。此外,本文题解用到了一次异或逻辑
本题的坑的不完全列举:
1、数据开头出现’-’
2、数据结尾出现’-’
3、‘-’两边不同时为数字或字母(这里可以用异或解决)
4。。。。。。(具体看注释)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
vector<char> a;
void tianchong(char pr,char ed,int p1,int p2,int p3){ //为了使程序结构清晰(也易于调试),这里把填充部分单独写一个子函数,值得注意的是,本文题解采用了一个vector来保存填充数据
if(pr=='-') {
cout<<'-'; //注意这里要有一个特判,防止最开始出现'-'
return;
}
a.clear(); //每次使用之前一定要清空
if(pr+1==ed) return;
if((isalpha(pr)^isalpha(ed))||ed<=pr){ //注意题上的条件,'-'两边必须同为字母或数字才能进行填充,注意这里的逻辑关系用异或
cout<<'-';
return;
}
int len=0;
if(p1==3){
for(char i=pr+1;i<ed;i++){
for(int j=0;j<p2;j++){
a.push_back('*');
len++;
}
}
}
else{
for(char i=pr+1;i<ed;i++){
for(int j=0;j<p2;j++){
a.push_back(i);
len++;
}
}
}
if(p1==2&&isalpha(pr)){
for(int i=0;i<len;i++) a[i]-=('a'-'A');
}
if(p3==2) reverse(a.begin(),a.end()); //转置
for(int i=0;i<len;i++) cout<<a[i];
}
int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int p1,p2,p3;
cin>>p1>>p2>>p3;
char ch;
char pr='-';
while(cin>>ch){ //这里写一个循环,基本的思想是用循环使得光标从左向右移动(从左到右处理每一个字符),针对光标 的每一次移动,都更新一次 pr和ed(pr和ed分别是当前字母的前、后一个字母),然后再用子函数处理pr和ed之间的填充问题
if(ch!='-'){
pr=ch; //更新pr
cout<<ch;
continue;
}
char ed;
int ok=0;
if(cin>>ed) ok=1;
tianchong(pr,ed,p1,p2,p3);
if(ok) cout<<ed;
pr=ed; //记住这里要更新一下pr的值 ,每次循环必须更新pr,不管ch是不是'-'
}
return 0;
}
作者
Bowen
本题所有题解、代码及注释均为作者原创,转载请注明出处。
本文作者水平有限,若有纰漏之处,敬请斧正。
欢迎大家一起学习交流。