[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有,即便難我也作,由於感受北郵作的人好少=。=,遇到點問題都不知道和誰討論下。。繼續努力!函數

相關文章
相關標籤/搜索