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

杭电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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值