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有,即便难我也作,由于感受北邮作的人好少=。=,遇到点问题都不知道和谁讨论下。。继续努力!函数