一道华为面试题

//华为面试题目
//通过键盘输入一串小写字母(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值