Uva 10815 - Andy's First Dictionary

按字典序把所给的一段话中的单词排序。

要考虑到一些影响因素,比如标点符号以及标点符号的位置会对我们的排序所造成的影响;

所以在读取这一段话时并不能简单的就用scanf("%s")来读取。

可以采取下面的方法用字符的形式来读取输入,然后再想办法将其转化为我们需要的不含有标点符号并且统一换成小写字母的字符串:

while(scanf("%c",&t)==1)  
    {  
        word[i][j]=t;  
        if(isalpha(t))  
            j++;  
        else  
        {   
            i++;  
            j=0;  
        }  
    }  //上面是读取字符,自动将不是字母的字符忽略丢弃~
    for(int k=0; k<510000; k++)  
        for(j=0; j<210; j++)  
        {  
            if(isupper(word[k][j]))  
                word[k][j]+=32;  
            if(!isalpha(word[k][j]))  
            {  
                word[k][j]='\0';  
                break;  
            }  
        }  //这一步完成向小写的转化和对单词的“规范化存储”

其实刚开始是不想敲这道题的,但后来看到了这里用qsort给单词按照字典序排序的方法!

觉得自己还是太嫩了...

是这样的:!!!!!!!!!!重点!!!!!!!!!!!!

int c_cmp(const void *_a,const void *_b)  
{  
    char *a=(char *)_a;  
    char *b=(char *)_b;  
    return strcmp(a,b);  
}  

    qsort(word,510000,sizeof(word[0]),c_cmp); 

以上是给单词排序的部分,个人觉得很神奇!也真的很好!

最后的一个小部分是将排完序的单词给去重输出,这一步让我等水人很是不快!因为懒人总是不想桥很多代码,可我等懒人有没有什么好的方法,所以咧这种题目一般是不做的...

去重输出如下:

for(int k=0; k<510000; k++)  
        if(isalpha(word[k][0])&&strcmp(word[k],word[k-1])!=0)  
            puts(word[k]);  

其实并不用每次都找到510000那么多,可以记下每次读进来的单词数。。还是因为懒人不想敲多代码,所以咧,不超时的话就这样好啦~


下面是完整代码:

#include <iostream>  
#include <cstdio>  
#include <cstdlib>  
#include <cstring>  
#include <cctype>  
using namespace std;  
int c_cmp(const void *_a,const void *_b)  
{  
    char *a=(char *)_a;  
    char *b=(char *)_b;  
    return strcmp(a,b);  
}  
char word[510000][210];  
  
int main()  
{  
    char t;  
    int i=0,j=0;  
    memset(word,0,sizeof(word));  
    while(scanf("%c",&t)==1)  
    {  
        word[i][j]=t;  
        if(isalpha(t))  
            j++;  
        else  
        {  
            if(isalpha(word[i][0]))  
            i++;  
            j=0;  
        }  
    }  
    for(int k=0; k<510000; k++)  
        for(j=0; j<210; j++)  
        {  
            if(isupper(word[k][j]))  
                word[k][j]+=32;  
            if(!isalpha(word[k][j]))  
            {  
                word[k][j]='\0';  
                break;  
            }  
        }  
    qsort(word,510000,sizeof(word[0]),c_cmp);  
    for(int k=0; k<510000; k++)  
        if(isalpha(word[k][0])&&strcmp(word[k],word[k-1])!=0)  
            puts(word[k]);  
    return 0;  
}  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值