模拟-洛谷P1098 字符串的展开 题解

一、题目链接

题目戳这里!

二、注意点

这道题想法不错,就是太坑,挖的坑多,给的样例又太简单,这就造成了本题得分率高,全对率极低,可以看到这道题提交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

本题所有题解、代码及注释均为作者原创,转载请注明出处。
本文作者水平有限,若有纰漏之处,敬请斧正。
欢迎大家一起学习交流。

发布了50 篇原创文章 · 获赞 7 · 访问量 1155

猜你喜欢

转载自blog.csdn.net/numb_ac/article/details/103090874