UVA 10815 (STL_C題)解題報告
阿新 • • 發佈:2018-01-21
col play pla put 大寫 != 應該 lose ans
題目鏈接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1756
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
題意:題目給出每行按空格分割的文本數據,要求統計出文章中所有的單詞並按字典序輸出,不區分大小寫。
思路:首先讀入數據,拆分成字符串,然後將大寫字母轉化為小寫字母,並對多余的標點符號進行處理。此後將每個單詞置入set中,set按字典序排列,輸出即可。看上去很簡單的一道題,但是有一些不容易註意到的坑。
註意:
1.本文中進行判斷的時候,很容易將anscii碼與‘A‘與‘z‘比較,但是,基於我們都知道的一個事實是‘A‘和‘a‘相差32,也就是說之間仍然有字符,91-96分別是[,\,],^,\,` 也就是說不能簡單按照‘A‘與‘z‘進行判斷。當然可以使用isalpha()判斷。
2.很自然的會想到標點符號可能會在字符首末,然而存在這樣的情況"Andy‘s apple",在這種情況下,輸出應為"andy s apple",所以,應該首先對字符串進行處理,即將不是字母的符號替換為‘ ‘(空格),然後再進行分割。
代碼:
#include<cstdio> #include<string> #include<iostream> #include<set> #include<sstream> #include <cstring> using namespace std; string s1; string cur; set<string> s; int main(void){ while(getline(cin,s1)){ for(int i=0;i<s1.length();i++){View Codeif(s1[i]<‘A‘||s1[i]>‘z‘||(s1[i]>‘Z‘&&s1[i]<‘a‘)){ s1[i]=‘ ‘; } } stringstream input1(s1); while(input1>>cur){ for(int i=0;i<cur.length();i++){ if(cur[i]>=‘A‘&&cur[i]<=‘Z‘){ cur[i]=cur[i]+32; } } if(cur.length()>0) s.insert(cur); } } set<string>::iterator it; for(it=s.begin();it!=s.end();it++) { cout<<*it<<‘\n‘; } return 0; }
UVA 10815 (STL_C題)解題報告