题目:

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
    1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
    2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。
要求实现函数: 
     void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
    输入pInputStr:  输入字符串lInputLen:  输入字符串长度
    输出 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
注意:只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例 
    输入:“cccddecc”   输出:“3c2de2c”
    输入:“adef”     输出:“adef”
    输入:“pppppppp” 输出:“8p”

分析:

将输入字符串拆分成多段,连续相同的字符串归为一段。

用标志位记录游标的位置,是指指向每一段字符串的第一个字母,如果后面字符跟它相同,则sameNum+1;如果不同,则标志位+1。

如果sameNum的值为1,表示一个字符相同,则只输出该字符,flag+1;否则,表示多个字符相同,则输出相同数量和该字符,flag+2。

注意:输出相同字符数量时,要进行ASCII码转换!

算法代码:

void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)
{
    int sameNum = 1;
    int outputFlag = 0;
    
    for (int i = 0; i < lInputLen; ++i) {
        if (pInputStr[i+1] == pInputStr[i]) {
            sameNum++;
        }
        else
        {
            if (1 == sameNum) {
                pOutputStr[outputFlag] = pInputStr[i];
                outputFlag++;
            }
            else
            {
                pOutputStr[outputFlag] = char(sameNum+48);
                pOutputStr[outputFlag+1] = pInputStr[i];
                outputFlag += 2;
                sameNum = 1;
            }
        }
    }
}

测试代码:

//
//  main.cpp
//  stringZip
//
//  Created by Jiajie Zhuo on 2017/4/1.
//  Copyright © 2017年 Jiajie Zhuo. All rights reserved.
//

#include <iostream>

using namespace std;

void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);

int main(int argc, const char * argv[]) {
    long lInputLen;
    
    cout << "Please enter the lInputLen: ";
    cin >> lInputLen;
    
    char *pInputStr = new char[lInputLen];
    char *pOutputStr = new char[lInputLen];
    
    cout << "Please enter the LnputStr: ";
    cin >> pInputStr;
    
    stringZip(pInputStr, lInputLen, pOutputStr);
    
    cout << "OutputStr is: ";
    cout << pOutputStr << endl;
   
    return 0;
}

考察了对字符串操作的掌握情况,还有游标的灵活使用。