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