offer题目45:把数组排成最小的数

问题描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接了出的所有数字中的最小的一个。例如,输入数组{3,32,321},则 打印这3个数字能排成的最小数字321323。

分析:题目其实是希望我们能找到一个排序规则,数组根据这个规则排序之后能排成一个最小数字。要确定排序规则,就要比较两个数字,给出两个数字m和n,我们需要确定这两个数字拼接后的数字mn和nm的大小。如果mn<nm,那么就该打印出mn,也就是m应该在n前面。另外拼接起来的数字可能很大,无法用现有的数字类型存储,可以所数字转换成字符串,比较它们大小只需要按照 字符串大小的比较规则就可以了。

代码:

#include <iostream>
#include <cstring>

const int g_MaxNumberLength = 10;                    //数字的最大位数
char* g_strCombine1 = new char[g_MaxNumberLength * 2 + 1];            //两个数m,n连接后形成的新数字mn
char* g_strCombine2 = new char[g_MaxNumberLength * 2 + 1];            //两个数m,n连接后形成的新数字nm

int compare(const void* strNumber1,const void* strNumber2){         //比较两个数字组成的字符串的大小
  strcpy(g_strCombine1,*(const char**)strNumber1);
  strcat(g_strCombine1,*(const char**)strNumber2);                 //mn

  strcpy(g_strCombine2,*(const char**)strNumber2);
  strcat(g_strCombine2,*(const char**)strNumber1);                //nm

  return strcmp(g_strCombine1,g_strCombine2);                     //比较mn与nm的大小
}



void PrintMinNumber(int* numbers,int length){
  if(numbers == nullptr || length <= 0)
          return;
  char** strNumber = (char**)(new int[length]);       //一个字符串数组,用来存放字符串化的数组数字元素
  for(int i = 0;i < length;++i){
    strNumber[i] = new char[g_MaxNumberLength + 1];
    sprintf(strNumber[i],"%d",numbers[i]);           //将数字数组中的元素转存为字符串
  }
  qsort(strNumber,length,sizeof(char*),compare);    //快排

  for(int i = 0;i < length;++i){
    printf("%s",strNumber[i]);                    //将排序后的字符串依次打印
  }
  printf("\n");
  for(int i = 0;i < length;++i){
    delete[] strNumber[i];                     
  }
  delete[] strNumber;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值