杭电1106 排序(字符串分割)

版权声明:ACM代码随意转载。算法描述需备注来源。谢谢合作。 https://blog.csdn.net/Sensente/article/details/89483624

杭电1106 http://acm.hdu.edu.cn/showproblem.php?pid=1106

题目大意:给定一串字符串,以字符串中的‘5’为分割,且去除前导0后按从小到大顺序输出。

题目思路:对于每个以5为分割的字符串数字大小,可以以b[i]*10 + (a[i] - '0')计算得到。即每进一位*10;

而对于分割的字符串,要分情况,第一种是遇到5,且前置一个字符不为5,这时b的计数下标要++,其次是遇到多个前导0,b下标只能+1次,若多个前导0出现在字符串中间,则归为前一种方案处理,若集中在最后,则需额外判断,即a[i]!='5'&&a[i+1]=='\0';注意是‘0’,此时下标才能++。

AC代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <stdlib.h>
//#define DEBUG
using namespace std;
char a[1005];
int b[1005];
int num;
bool f;
int main() {
    while(cin>>a) {
        int len=strlen(a);
        num=0;
        f=0;
        memset(b,0, sizeof(b));
        for(int i=0;i<len;i++) {
           if(a[i]!='5') {
               b[num]=b[num]*10+(a[i]-'0');
               f=1;
           }
           else if(a[i]=='5'&&f) {   //这个else if可以说是精髓所在。f用于判断
               num++;
               f=0;
           }
           if(a[i]!='5'&&a[i+1]=='\0') { //'\0'
               num++;
           }

        }
        sort(b,b+num);
        for(int i=0;i<num-1;i++) {
            cout<<b[i]<<" ";
        }cout<<b[num-1]<<endl;
    }
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Sensente/article/details/89483624