博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】信息奥赛一本通1185:单词排序(OJ题目描述有问题)
阅读量:4029 次
发布时间:2019-05-24

本文共 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 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的文章
arm linux 生成火焰图
查看>>
jtag dump内存数据
查看>>
linux和windows内存布局验证
查看>>
linux config
查看>>
linux insmod error -1 required key invalid
查看>>
linux kconfig配置
查看>>
linux不同模块completion通信
查看>>
linux printf获得时间戳
查看>>
C语言位扩展
查看>>
linux dump_backtrace
查看>>
linux irqdebug
查看>>
git 常用命令
查看>>
linux位操作API
查看>>
snprintf 函数用法
查看>>
uboot.lds文件分析
查看>>
uboot start.s文件分析
查看>>
没有路由器的情况下,开发板,虚拟机Ubuntu,win10主机,三者也可以ping通
查看>>
本地服务方式搭建etcd集群
查看>>
安装k8s Master高可用集群
查看>>
忽略图片透明区域的事件(Flex)
查看>>