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