SDUT 2352 Run Length Encoding

点我看题目 

题意 :将给定的字符串编码,编码的规则根据两条,1.如果字符串里有连续相等的字符,就变为两个字符,一个是这些连续相同的字符的个数,另一个是这个字符,但是如果数量超过了9个,那就输出9再输出这个字符,剩下的重新按照规则进行,例如AAAA,就输出4A,AAAAAAAAAAA输出9A2A,2.如果字符串里有连续不相等的字符,就将这些字符原样输出并且在前后各加一个1,如果字符串里有刚好有个1,就将这个1变为11,AAAABCCC输出4A1B13C,123444输出11123134,1111111111输出911111。

思路 :就是一道顶麻烦的题,如果不好好读题的话,就很难办,因为有很多细节问题都需要注意,比如说输入空格也算字符,输入换行也要处理。最后一组样例是10个1,按照编码规则先输出9个1,还剩一个1就要根据规则2进行编码,因为是1个1所以要在前后各加一个1,又因为是一个单独的1,所以要把1变成11

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>

const int maxn = 424567 ;
char sh[maxn] ;
char ch[maxn] ;

using namespace std;

int main()
{
    while(gets(sh))
    {
        int x = 0,j ;
        int len = strlen(sh) ;
        //   printf("%d",len);
        for(int i = 0 ; i < len ; )
        {
            j = i + 1;
            if(sh[i] == sh[j])
            {
                while(sh[i] == sh[j])
                {
                    j++ ;
                    if(j - i >= 9)
                        break ;
                }
                ch[x++] = j-i+'0' ;
                ch[x++] = sh[i] ;
                i += (j-i) ;
            }
            else
            {
                while((sh[j] != sh[j+1] && j+1 < len) || j == len-1)
                    j++ ;
                ch[x++] = '1' ;
                for(int ii = i ; ii < j ; ii++)
                {
                    ch[x++] = sh[ii] ;
                    if(sh[ii] == '1' )
                        ch[x++] = '1' ;
                    //if(j == 0 && sh[j] != sh[j+1])
                    //ch[x++] = '1' ;
                }
                ch[x++] = '1' ;
                i += (j-i) ;
            }
        }
        ch[x] = '' ;
        printf("%s
",ch) ;
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3560782.html