• 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
    ",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
    ",a[i]);
            }
        }
        return 0;
    }
    彼时当年少,莫负好时光。
  • 相关阅读:
    C# WinForm判断Win7下程序是否以管理员身份运行
    C#设置文件(夹)权限
    验证字符串是否为有效的IP地址
    内存对齐
    C#线程启动时传入参数
    写字符串内容到文件
    Thread.Abort() Is Evil.
    如何优雅地控制线程状态
    C#读取文件,返回字符串形式的文件内容
    关于产生不重复随机数的算法 C#
  • 原文地址:https://www.cnblogs.com/l609929321/p/6596278.html
Copyright © 2020-2023  润新知