[NBOJ0061][Sapphire的反转文]

[题目要求]

http://acm.bupt.edu.cn/onlinejudge/newoj/showProblem/show_problem.php?problem_id=61php

[题目设计的相关理论与算法]
C++中string处理,包括find的方法,几种初始化方法
反转文的理解
宏定义ios

[题目中须要注意的地方]
题目中说到的,每一个单词遇到“#”号结束,只是说遇到井号把以前的全部符号保留顺序,可是不包括#号,#号该怎么处理就怎么处理。
与此同时,若是单词一直输入到末尾,也就是说即便没有#号,咱们也要将其纳入到一个单词中,这时前面的find函数查找“#”会返回npos,这时要单独做为一个状况处理,具体见代码。算法

[思路过程]
将一整行读入,而后遍历,遇到字符是字母的就检测后面的#号,并把之间的全部内容加入到一个string数组中,其余的符号都是单独成一个string加入到数组。
两个小时左右,按理说也是一道水题,可是谁让咱基础不过硬,许多string中的方法和参数仍是查的书,才正确使用。但愿之后慢慢熟悉,愈来愈快。数组

[代码]app

#include<iostream>
#include<string>
int const MAX = 1200;
#define ALP (sAll[i] <= 90 && sAll[i]>=65) || (sAll[i]<=122 && sAll[i]>=97) 
//这里使用宏定义简写对字母查找的代码,可是实际上后面也只用了一次= =,想起来就用一下哈
using namespace std;
int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);	
	string sAll;		//这里输入的原始数据,包括各类符号和单词
	getline(cin,sAll);
	string sTable[MAX];	//创建一个string列表,用来对最后的提取单词以后的列表翻转。最坏状况是所有都是单字符。
	int k=0;			//用来记录
	string::size_type i=0,first=0,last=0;//注意类型,貌似是unsigned,可是这么写确定不会错。
	while(i < sAll.length())
	{
		if(ALP)
		{		
			first =i;					//其实每次只用i做为查找起始点就能够了,这里只是便于理解。
			last = sAll.find('#',first);//查找遇到字母后的“#”号
			if(last == string::npos)	//若是没有查到,说明一直到结尾都是单词的内容,那么就所有算做一个对象
			{
				string s(sAll,first);	//注意这个初始化方法。不写长度参数,就是到结尾都算进来。
				sTable[k++] = s;
			}
			else 
			{
				string s(sAll,first,last-first);//last-first就是长度。注意不包括#号
				sTable[k++] = s;
			}			
			i=last;					//下次遍历的七点。
		}
		else
		{
			sTable[k++] = sAll[i++];//若是不是字母,那么每个都是单独的对象来处理。
		}
	}
	for(int i = 0;i<k/2;i++)	//翻转过程。
	{
		string s = sTable[i];
		sTable[i] = sTable[k-i-1];
		sTable[k-i-1] = s;
	}
	for(int i=0;i<k;i++)		//将翻转后的结果输出。
		cout<<sTable[i];
	cout<<endl;
	//fclose(stdin);
	//fclose(stdout);
	return 0;
}

[尾声]
题目作得很顺利,仍是以为这题比较水。我如今也会跳一些题了=。=,哎。。畏难情绪了。。我如今遇到北邮这些题一方面也查一下pku有没有,若是pku有,即便难我也作,由于感受北邮作的人好少=。=,遇到点问题都不知道和谁讨论下。。继续努力!函数

相关文章
相关标签/搜索