华为笔试代码(zip解压)//好友答案
#include “stdafx.h”
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include<string.h>
using namespace std;
#include
using namespace std;
//初始化数据
struct cun{
int d ; //存放数字所在的下标
int c; //用于存放数字"0"到9
char a;//数字对应的首字母
int d1;//存放对应首字母所在的下标
};
//如果数字相同存放数字相同的字母
//相同字母所在的下标.
//根据数字比较大小,存放存放数字的下表,如果数字相同根据
bool com(cun &c1, cun&c2)
{
if (c1.c < c2.c)
return true;
else if (c1.c==c1.c&&c1.a<c2.a)
{
return true;
}
else
{
return false;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
vectorvectorjieya;
string dd;
cin >>dd;
cun cun1;
for (int i = 0; i < dd.size(); i++)
{
if (dd[i] >= ‘0’&&dd[i] <= ‘9’)
{
cun1.c = dd[i]-‘0’;
cun1.d = i;
int ii = i;
while (ii–)
{
if (ii != 0)
{
if (dd[ii] >= ‘0’&&dd[ii] <= ‘9’)
{
cun1.d1 = ii + 1;
cun1.a = dd[ii + 1];
break;
}
}
if (ii==0)
{
cun1.d1 = 0;
cun1.a = dd[0];
}
}
}
else
{
continue;
}
vectorjieya.push_back(cun1);
}
string XFSX;
sort(vectorjieya.begin(), vectorjieya.end(),com);
for (int i = 0; i < vectorjieya.size(); i++)
{
while (vectorjieya[i].c–)
{
//XFSX.append(dd, vectorjieya[i].d1, vectorjieya[i].d);
XFSX.append(dd, vectorjieya[i].d1,(vectorjieya[i].d-vectorjieya[i].d1));
}
}
cout << XFSX << endl;
while (true)
{
}
return 0;
}
我看错题目后的解决答案
与此题的输入类型输出类型不同:本答案可以输出超过9的字符串,输出是按字符串的字符传的asc码的大小输出的,具体答案如下
a10b2 的输出为aaaaaaaaaabb;
c2b2a2d2的输出为aabbccdd;
代码如下所示:
#include
#include
#include
using namespace std;
//初始化数据
struct cun{
char b; //用于存放字母
int c; //用于存放个数
};
struct cun *ininate(string a,int &p){ //初始化程序到stg,m用于记录总字母数
cun *stg=new cun[100];
int i=0;
stringstream ss;
int m=0;
int n=0;
while(a[i]!=’\0’){
if((a[i]>=‘a’&&a[i]<=‘z’)||(a[i]>=‘A’&&a[i]<=‘Z’)){//第一个字符为字母,格式符合要求;
stg[m].b=a[i];//对于第一个字符的处理;
i++;
if(a[i]==’\0’){
stg[m].c=1;
m++;
break;
}
string t;
if((a[i]>=‘a’&&a[i]<=‘z’)||(a[i]>=‘A’&&a[i]<=‘Z’)){ //是单个字母
stg[m].c=1;
m++;
//i–;
continue;
}
for(n=i;n<=a.length();n++){ //是字母后面的数字串
if(a[n]<‘0’||a[n]>‘9’){//对数字的处理
break;
}
}
//stg[m].b=’’;
for(;i<n;i++){//把数字存到结构体中;
t+=a[i];
}
ss.clear();
ss.str(t);
ss>>stg[m].c;
t=’ ';
m++;
//i=n;
}
}
p=m;
return stg;
}
string zip(struct cun *stg,int &p){//解压数据;
int i=0,h,m,count,e,j;
int v=p;
string d;
for(;i<=v;i++){ //数据处理
if(stg[i].c!=stg[i+1].c){ //没有重复项
for(h=0;h<stg[i].c;h++){
d+=stg[i].b;
}
continue;
}
count=0;//统计重复的数字个数
e=i; //记录数据的下一个不重复的位置
for(m=i;m<=v;m++){ //统计重复的数字个数
if(stg[e].c!=stg[e+1].c){
break;
}
e++;
count++;
}
for(m=0;m<count;m++){ //把加压包中重复的数据排序
for(j=m+1;j<(count+1);j++){
if(stg[i+m].b>stg[i+j].b){
char y=stg[i+m].b;
stg[i+m].b=stg[i+j].b;
stg[i+j].b=y;
}
}
}
for(m=0;m<=count;m++){
for(h=0;h<stg[i].c;h++){
d+=stg[i+m].b;
}
}
i=i+count;
}
return d;
}
int main(){
string k,d; //定义字符串
cin>>k; //输入数据
cun *st;
int o;
st=ininate(k,o);
cout<<o<<endl;
for(int i=0;i<o;i++){
cout<<st[i].b<<endl;
cout<<st[i].c<<endl;
}
d=zip(st,o);
cout<<d<<endl;
return 0;
}