华为:现有一串字符串,请对字符串中的数字字符按照升序排序,其他非数字字符存储位置保持不变,将结果保存至output数组中

/*
现有一串字符串,请对字符串中的数字字符按照升序排序,
其他非数字字符存储位置保持不变,将结果保存至output数组中。
【注:字母可能包含大写、小写字母、数字以及控制字符】
要求实现函数my_sort(char input[],char output[])

例子:
input:a3vues4sdf2kjk9df0v
output:a0vues2sdf3kjk4df9v
*/

#include<iostream>
#include<string.h>
using namespace std;
/***********************************************************************/
void mysort(char input[], char output[])
{
     int m = strlen(input),i=0;
     int *location = new int [m];
     int *digital = new int [m];
     int digital_count = 0;
     int tmp = 0;
     //记录出现数字的位置,并且将数字集中到digital[]数组中
     for(i=0; i<m; i++)
     {
         if(input[i]>='0' && input[i]<='9')
         {
             location[digital_count] = i;
             digital[digital_count] = input[i] - '0';
             digital_count++;
         }
         output[i] = input[i];
     }
     //使用冒泡排序
     for(i=1; i<digital_count; i++)
     {
         for(int j=i; j>0; j--)
         {
             if(digital[j] < digital[j-1])
             {
                 tmp = digital[j];
                 digital[j] = digital[j-1];
                 digital[j-1] = tmp;
             }
         }
     }
     //将排好序的数组插入到output当中
     for(i=0; i<digital_count; i++)
     {
         output[location[i]] = digital[i] + '0';
     }
     output[m] = '\0';//手工加上字符数组结束标志,因为字符数组不会自动在末尾加上结束符;
     delete [] location;
     delete [] digital;
}

void test1()
{
     int index = 0;
     char input[] = "u8x9@0ab7yu2";
     char *output = new char[strlen(input)+1];
     mysort(input,output);
     while(output[index] != '\0')
     {
         cout << output[index++];
     }
     cout << endl;
     delete [] output;
     
 }

/***********************************************************************/

struct node
{
    char c;//记录数字字符
    int index;// 记录字符下标 以便回填
};
void BubbleSort(node a[],int size);
void my_sort(char input[],char output[]);

int main()
{
    char *a = "a3vues4sdf2kjk9df0v"; //此处也可由用户输入

    char *b = new char[strlen(a)+1];

    if(!b)
    {
        return -1;//内存分配检查
    }
    my_sort(a,b);
    cout<<a<<endl<<b<<endl;
    delete b;
    b = NULL;

	cout<<"------------------------------------------"<<endl;
	test1();
}
void my_sort(char* input,char* output)
{
    int size = 0;//统计数字字符个数
    int i = 0;
    int j = 0;
    if(!input || !output)
    {
        return;
    }
 

    for(i=0;input[i]!='\0';i++)
    {
        output[i] = input[i];
        if(input[i]>='0'&& input[i]<='9')
        {
            size++;
        }
    }
    output[i] = '\0';
    node* temp = new node[size];
    if(!temp)
    {
        return;
    } //内存分配检查
    for(j=0,i=0;input[i]!='\0';i++)
    {
        if(input[i]>='0'&& input[i]<='9')
        {
            temp[j].c = input[i];
            temp[j].index = i;
			j++;
        }
    }
    BubbleSort(temp,size);

    for(i=0;i<size;i++)
    {
        output[temp[i].index] = temp[i].c;
    }

    delete temp;
    temp = NULL;
    }

void BubbleSort(node a[],int size)
{
    for(int i=0;i<size-1;++i)
    {
        for(int j=i+1;j<size;++j)
        {
        if(a[i].c > a[j].c)
        {
            char c = a[i].c;
            a[i].c = a[j].c;
            a[j].c = c;
        }
    }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值