本文共 2914 字,大约阅读时间需要 9 分钟。
转自:
1185:单词排序
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 3474 通过数: 1685 【题目描述】 输入一行单词序列,相邻单词之间由1个或多个空格间隔,请按照字典序输出这些单词,要求重复的单词只输出一次。(区分大小写)【输入】
一行单词序列,最少1个单词,最多100个单词,每个单词长度不超过50,单词之间用至少1个空格间隔。数据不含除字母、空格外的其他字符。【输出】
按字典序输出这些单词,重复的单词只输出一次。【输入样例】
She wants to go to Peking University to study Chinese 【输出样例】 Chinese Peking She University go study to wants这题表述有问题,题目说是一行单词序列,但是我编程序接收一行单词序列时,样例都能过,自己输入英文句子,也能过。提交时所有点都是“答案错误”(看我的程序一代码)。后来,问了别人,别人告诉我,是要接收多行单词,把程序改了一下,反复接收一行单词,并记录,就过了。(看我的程序二代码)
区别就是把getline(cin,danci)放在while循环中,反复接收单词序列,直到文件结束,停止接收(因为测试OJ是通过文件进行输入输出的)。希望后面的人不要跟我一样被题目描述坑了哦。
程序一(所有点提示答案错误):
//1185:单词排序
#include<iostream> #include<cstring> #include<algorithm> using namespace std; char a[101][51]; int len,i,k=0,j; string danci;void paixu(char a[101][51],int start,int end) //自定义排序函数,对字二维符串数组排序
{ char tmp[51]; int i,j; for(i=end-1;i>=1;i--) { for(j=start;j<=i;j++) { if(strcmp(a[j],a[j+1])>0) //如果字典序逆序,则交换 { strcpy(tmp,a[j]); //将a[j]字符串复制到临时字符串tmp中 strcpy(a[j],a[j+1]); strcpy(a[j+1],tmp); } } } return; } int main() { bool flag=false;//是否遇到一个新单词,false表示没有遇到,true表示遇到了 memset(a,0,sizeof(a)); getline(cin,danci);//接收单词序列,碰到换行结束,可以接收空格 danci=" "+danci+" ";//在单词序列前后加空格 len=danci.length();j=0;
for(i=0;i<len;i++) { if(danci[i]==' ') //碰到空格,表明不是一个单词 { flag=false; //a[k][j]='\0'; } else //碰到的不是空格时 { if(flag==false) { k++;//新单词 j=0; flag=true; a[k][j]=danci[i]; j++; } else //单词中间字母 { a[k][j]=danci[i]; j++; } } } paixu(a,1,k);//对记录1至k的单词按字典序升序排序 for(i=1;i<=k;i++) { if(strcmp(a[i],a[i-1])==0)//如果和前面字符串相等,则不输出,相同字符串输出一次 continue; cout<<a[i]<<endl; } return 0; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 程序二(所有点通过)://1185:单词排序
#include<iostream> #include<cstring> #include<algorithm> using namespace std; char a[101][51]; int len,i,k=0,j; string danci;void paixu(char a[101][51],int start,int end) //自定义排序函数,对字二维符串数组排序
{ char tmp[51]; int i,j; for(i=end-1;i>=1;i--) { for(j=start;j<=i;j++) { if(strcmp(a[j],a[j+1])>0) //如果字典序逆序,则交换 { strcpy(tmp,a[j]); //将a[j]字符串复制到临时字符串tmp中 strcpy(a[j],a[j+1]); strcpy(a[j+1],tmp); } } } return; } int main() { bool flag=false;//是否遇到一个新单词,false表示没有遇到,true表示遇到了 memset(a,0,sizeof(a)); while(getline(cin,danci))//反复接收单词序列(接收多行单词序列),碰到换行结束,可以接收空格 { danci=" "+danci+" ";//在单词序列前后加空格 len=danci.length(); j=0; for(i=0;i<len;i++) { if(danci[i]==' ') //碰到空格,表明不是一个单词 { flag=false; //a[k][j]='\0'; } else //碰到的不是空格时 { if(flag==false) { k++;//新单词 j=0; flag=true; a[k][j]=danci[i]; j++; } else //单词中间字母 { a[k][j]=danci[i]; j++; } } } } paixu(a,1,k);//对记录1至k的单词按字典序升序排序 for(i=1;i<=k;i++) { if(strcmp(a[i],a[i-1])==0)//如果和前面字符串相等,则不输出,相同字符串输出一次 continue; cout<<a[i]<<endl; } return 0; } --------------------- 作者:mengdicfm 来源:CSDN 原文:https://blog.csdn.net/mengdicfm/article/details/88384963 版权声明:本文为博主原创文章,转载请附上博文链接!