题目:
通过键盘输入一串小写字母(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;
}
考察了对字符串操作的掌握情况,还有游标的灵活使用。