UVA 10815 (STL_C题)解题报告

Posted caomingpei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA 10815 (STL_C题)解题报告相关的知识,希望对你有一定的参考价值。

题目链接: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题)解题报告的主要内容,如果未能解决你的问题,请参考以下文章

UVA 11995 (STL_E题)解题报告

UVA 10054(DFS_G题)解题报告

UVA 12627(递推&递归_H题)解题报告

UVA 12034(递推&递归_I题)解题报告

UVa -1584 Circular Sequence 解题报告

安迪的第一个字典(UVa10815)