HDU 1106 排序

排序

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 56641    Accepted Submission(s): 16579


Problem Description
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。

你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。

 

 

Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。  

输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
 

 

Output
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
 

 

Sample Input
0051231232050775
 

 

Sample Output
0 77 12312320
 

 

Source
 

 好烦呀!!!刚刚那一遍没贴出

第一次写的时候想的太简单了  很多情况都没有考虑到

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
int a[1010];
int main()
{
    char str[1010];
    while(~scanf("%s",str))
    {
        int sum=0,j=0;
        memset(a,0,sizeof(a));
        for(int i=0;i<strlen(str);i++)
        {
            if(str[i]=='5')
            {
                a[j++] = sum;
                sum = 0;
            }
            else sum = sum*10 + str[i] - '0';
        }
        sort(a,a+j);
        for(int i=0;i<j;i++)
        {
            if(i!=j-1)
                printf("%d ",a[i]);
            else printf("%d\n",a[i]);
        }
    }
}

后来在网上看了别人的代码才知道自己有很多情况没有考虑到,在这里列出我所发现的特殊情况

1  5在最前面

2  5在最后面

3  中间有多个5

4  除一个外都是5

5  最后面不是5

个人在想了很久后,采用了标记法,即在累加后变化标记flag,然后通过判断标记来跟新数组里存储的整数(个人一直很喜欢标记法,因为巧打标记就可以任意执行自己想要的步骤了,巧用标记可以解决很多复杂的问题哦)

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
int a[1010];
int main()
{
    char str[1010];
    while(~scanf("%s",str))
    {
        int sum=0,j=0,flag=0;
        memset(a,0,sizeof(a));
        for(int i=0; i<strlen(str); i++)
        {
           if(str[i]=='5'||i == strlen(str)-1)//这里是可以跟新数组的条件
           {
               if(i==strlen(str)-1)
               {
                   if(str[i]!='5')//注意最后一个不为5时才跟新数组
                   {
                       flag = 1;//注意标记在哪里打,累加时打,代表跟新整数
                       sum = sum*10 + str[i] - '0';
                   }
               }
               if(flag)
               {
                   a[j++] = sum;
                   flag = 0;
               }
               sum = 0;
           }
           else
           {
               flag = 1;
               sum = sum*10 + str[i] - '0';
           }
        }
        sort(a,a+j);
        for(int i=0; i<j; i++)
        {
            if(i!=j-1)
               printf("%d ",a[i]);
            else printf("%d\n",a[i]);
        }
    }
    return 0;
}

 

posted on 2017-03-21 19:35  九月旧约  阅读(225)  评论(0编辑  收藏  举报

导航