按字典序把所给的一段话中的单词排序。
要考虑到一些影响因素,比如标点符号以及标点符号的位置会对我们的排序所造成的影响;
所以在读取这一段话时并不能简单的就用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;
}