题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
例如输入数组{32, 321},则输出这两个能排成的最小数字32132。
按照这种大小关系从小到到排列,连接起来的串构成的数字最小
例如输入数组{32, 321},则输出这两个能排成的最小数字32132。
请给出解决问题的算法,并证明该算法。
思路:参见《剑指offer》,需要定义一种判断两个串大小的比较方式
"123""32" 和 "32""123" 前者小于后者,对应"123" < "32"
char* g_strCombine1 = new char[256];
char* g_strCombine2 = new char[256];
int CompareString(const void* strnumber1,const void* strnumber2)
{
<span style="white-space:pre"> </span>strcpy(g_strCombine1,*(const char**)strnumber1);
<span style="white-space:pre"> </span>strcat(g_strCombine1,*(const char**)strnumber2);
<span style="white-space:pre"> </span>strcpy(g_strCombine2,*(const char**)strnumber2);
<span style="white-space:pre"> </span>strcat(g_strCombine2,*(const char**)strnumber1);
<span style="white-space:pre"> </span>return strcmp(g_strCombine1,g_strCombine2);
}
按照这种大小关系从小到到排列,连接起来的串构成的数字最小
void PrintMinNumber(int* number,int len)
{
if(number==NULL || len<=0)
return ;
char** strnumber = (char**)(new int[len]);
for (int i =0;i<len;++i)
{
strnumber[i] = new char[256];
sprintf(strnumber[i],"%d",number[i]);
}
qsort(strnumber,len,sizeof(char*),CompareString);
for (int i =0;i<len;++i)
cout<<strnumber[i];
cout<<endl;
for (int i =0;i<len;++i)
delete[] strnumber[i];
delete[] strnumber;
}