问题描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接了出的所有数字中的最小的一个。例如,输入数组{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;
}