1. 程式人生 > >UVA 10815 (STL_C題)解題報告

UVA 10815 (STL_C題)解題報告

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++){
                
if(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; }
View Code

UVA 10815 (STL_C題)解題報告