华为机试 解压字符串;开始没做出来,后来继续做;只记得一条case,代码仅供参考

本文介绍了一种基于字符和数字的复杂字符串处理与排序算法,该算法首先将输入字符串分割成数字和字符部分,然后根据数字大小和字符字典顺序进行排序,最后重新组合输出。涉及的关键步骤包括字符和数字的识别、临时存储结构的设计、排序逻辑的实现及最终字符串的拼接。

// a11b2bac3bad3abcd2 输入

 //bbabcdabcdbacbacbacbadbadbadaaaaaaaaaaa 输出

 //bbabcdabcdbacbacbacbadbadbadaaaaaaaaaaa

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

int isNum(char c)

{

   if(c >='1' && c <= '9')

   {

     return 1;

   }

   return 0;

}

 

int isChar(char c)

{

   if(c >='a' && c <= 'z' || c >='A' && c <= 'B')

   {

     return 1;

   }

   return 0;

}

struct StrList

{

    int num;

    char str[255];

    /* data */

};

int sortByStr(struct StrList *detail,int strLen)

{

    struct StrList tmpDetail;

    for (int t = 0; t < strLen; t++)

    {

        for (int i = 0; i < 255; i++)

    { 

        if(detail[i].num && strlen(detail[i].str)){

            for (int j = 0;j < 255 -i - 1; j++)

            {

               if(detail[j].num && strlen(detail[j].str)){

                    if(detail[j].str[t] > detail[j+1].str[t]){

                         tmpDetail = detail[j];

                         detail[j] = detail[j+1];

                         detail[j+1] = tmpDetail;

                     }

                }

                /* code */

            }

        }

    }      

    }

}

int main()

{

   char a[1000];

   char b;

   scanf("%s",a);

   struct StrList detail[255]={};

    int numCount = 0;

    int strCount = 0;

    char tmpStr[255] = {0};

    for (int i,j = 0; i < strlen(a); i++)

    {

        char *p = a + i;

        if(isNum(a[i])){

           numCount = 0;

            char tmpNumStr[255] = {0};

            while (isNum(*p))

            {

                numCount++;

                p++;

            }

            i+=(numCount-1);

            strncpy(tmpNumStr,p-numCount,numCount);

           // printf("tmpNumStr = %s\n",tmpNumStr);

           detail[j].num = atoi(tmpNumStr);

            memccpy(detail[j].str,tmpStr,0,sizeof(tmpStr));

            j++;

        }else{

            strCount= 0;

            while (isChar(*p))

            {

                strCount++;

                p++;

                //i++;

            }

            i+=(strCount-1);

            memset(tmpStr,0,sizeof(tmpStr));

            strncpy(tmpStr,p-strCount,strCount);

            //printf("tmpStr = %s\n",tmpStr);

        }

    }

    char dest[1000] = {};

    struct StrList tmpDetail;

    for (int i = 0; i < 255; i++)

    { 

        if(detail[i].num && strlen(detail[i].str)){

            for (int j = 0;j < 255 -i - 1; j++)

            {

               if(detail[j].num && strlen(detail[j].str)){

                    //printf("num = %d,str = %s\n",detail[j].num,detail[j].str);

                    // printf("i num = %d,j num = %d\n",detail[i].num,detail[j].num);

                    if(detail[j].num > detail[j+1].num){

                         tmpDetail = detail[j];

                         detail[j] = detail[j+1];

                         detail[j+1] = tmpDetail;

                     }

                     if(strlen(detail[j].str) ==  strlen(detail[j+1].str)

                     &&detail[j].str > detail[j+1].str){

                          tmpDetail = detail[j];

                         detail[j] = detail[j+1];

                         detail[j+1] = tmpDetail;

                     }

                }

                /* code */

            }

        }

    }    

   

       for (int i = 0; i < 255; i++)

    { 

        if(detail[i].num && strlen(detail[i].str)){

            printf("end num = %d,str = %s\n",detail[i].num,detail[i].str);

            for (int j = 0; j < detail[i].num; j++)

            {

                strcat(dest,detail[i].str);

            }

        }

    }    

    printf("%s\n",dest);

   return 0;

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值