华为面试题——压缩字符串

来源:互联网 发布:小米mix2淘宝优惠卷 编辑:程序博客网 时间:2024/05/16 10:35

题目:

通过键盘输入一串小写字母(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;}

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

0 0