//华为面试题目
//通过键盘输入一串小写字母(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”
#include <iostream>
#include <vector>
#define max_length 1000
using namespace std;
struct zipstructure
{
char s;
int length;
};
void stringZipV1(const char *pInputStr, long lInputLen, char *pOutputStr)
{
//记录当前字符的长度;
int length=1;
//记录当前字符的位置;
int location=0;
//判断是否存入字母及长度;
std::vector<zipstructure> zipout;
//存储当前字母是哪个及长度
zipstructure a;
//记录pOutputStr存储到哪一位
int poutlength=0;
//
char temp[30];
while(location<lInputLen)
{
if(pInputStr[location]==pInputStr[location+length])
length+=1;
else
{
a.length=length;
a.s=pInputStr[location];
zipout.push_back(a);
location+=length;
length=1;
}
}
//将pOutputStr赋值
for(int i=0;i<zipout.size();i++)
{
if(zipout[i].length==1)
{
//*pOutputStr=zipout[i].s;
//pOutputStr++;
pOutputStr[poutlength]=zipout[i].s;
poutlength++;
}
else
{
//*pOutputStr=zipout[i].length;
//pOutputStr++;
//*pOutputStr=zipout[i].s;
//pOutputStr++;
itoa(zipout[i].length,temp, 10);
pOutputStr[poutlength]=temp[0];
poutlength++;
pOutputStr[poutlength]=zipout[i].s;
poutlength++;
}
}
//补全最后一位
pOutputStr[poutlength+1]='\0';
}
void stringZipV2(const char *pInputStr, long lInputLen, char *pOutputStr)
{
//记录当前字符的长度;
int length=1;
//记录当前字符的位置;
int location=0;
//
int poutlength=0;
//
char temp[30];
while(location<lInputLen)
{
if(pInputStr[location]==pInputStr[location+length])
length+=1;
else
{
if(length==1)
{
pOutputStr[poutlength]=pInputStr[location];
poutlength++;
}
else
{
itoa(length,temp, 10);
pOutputStr[poutlength]=temp[0];
poutlength++;
pOutputStr[poutlength]=pInputStr[location];
poutlength++;
}
location+=length;
length=1;
}
}
pOutputStr[poutlength+1]='\0';
}
void main()
{
//test函数
char *a="pppppppp";
char *pOutputStr=new char(max_length);
cout<<strlen(a)<<endl;
stringZipV2(a,strlen(a),pOutputStr);
cout<<pOutputStr<<endl;
}
//通过键盘输入一串小写字母(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”
//code by jingxiaoyang
//恳请大家指出错误!
#include <iostream>
#include <vector>
#define max_length 1000
using namespace std;
struct zipstructure
{
char s;
int length;
};
void stringZipV1(const char *pInputStr, long lInputLen, char *pOutputStr)
{
//记录当前字符的长度;
int length=1;
//记录当前字符的位置;
int location=0;
//判断是否存入字母及长度;
std::vector<zipstructure> zipout;
//存储当前字母是哪个及长度
zipstructure a;
//记录pOutputStr存储到哪一位
int poutlength=0;
//
char temp[30];
while(location<lInputLen)
{
if(pInputStr[location]==pInputStr[location+length])
length+=1;
else
{
a.length=length;
a.s=pInputStr[location];
zipout.push_back(a);
location+=length;
length=1;
}
}
//将pOutputStr赋值
for(int i=0;i<zipout.size();i++)
{
if(zipout[i].length==1)
{
//*pOutputStr=zipout[i].s;
//pOutputStr++;
pOutputStr[poutlength]=zipout[i].s;
poutlength++;
}
else
{
//*pOutputStr=zipout[i].length;
//pOutputStr++;
//*pOutputStr=zipout[i].s;
//pOutputStr++;
itoa(zipout[i].length,temp, 10);
pOutputStr[poutlength]=temp[0];
poutlength++;
pOutputStr[poutlength]=zipout[i].s;
poutlength++;
}
}
//补全最后一位
pOutputStr[poutlength+1]='\0';
}
void stringZipV2(const char *pInputStr, long lInputLen, char *pOutputStr)
{
//记录当前字符的长度;
int length=1;
//记录当前字符的位置;
int location=0;
//
int poutlength=0;
//
char temp[30];
while(location<lInputLen)
{
if(pInputStr[location]==pInputStr[location+length])
length+=1;
else
{
if(length==1)
{
pOutputStr[poutlength]=pInputStr[location];
poutlength++;
}
else
{
itoa(length,temp, 10);
pOutputStr[poutlength]=temp[0];
poutlength++;
pOutputStr[poutlength]=pInputStr[location];
poutlength++;
}
location+=length;
length=1;
}
}
pOutputStr[poutlength+1]='\0';
}
void main()
{
//test函数
char *a="pppppppp";
char *pOutputStr=new char(max_length);
cout<<strlen(a)<<endl;
stringZipV2(a,strlen(a),pOutputStr);
cout<<pOutputStr<<endl;
}