zip解压

华为笔试代码(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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值