输入一个正整数数组,数组里面所有数字拼接起来排成一个数,打印能拼接出的所有数字最小的一个。
例如输入数组{3,32,321},则打印出最小数字321323
const int g_MaxNumberLength = 10;
char* g_StrCombine1 = new char[g_MaxNumberLength*2 +1];char* g_StrCombine2 = new char[g_MaxNumberLength*2 +1];
int compare(const void* strNumber1,const void* strNumber2)
{
strcpy(g_StrCombine1,*(const char**)strNumber1);
strcat(g_StrCombine1,*(const char**)strNumber2);
strcpy(g_StrCombine2,*(const char**)strNumber2);
strcat(g_StrCombine2,*(const char**)strNumber1);
return strcmp(g_StrCombine1,g_StrCombine2);
}
void PrintMinNumber(int* numbers,int length)
{
if(numbers == NULL || length <= 0)
return;
char** strNumbers= (char**)(new int[length]);
for(int i = 0;i < length;++i)
{
strNumbers[i] = new char[g_MaxNumberLength + 1];
sprintf(strNumbers[i],"%d",numbers[i]);
}
qsort(strNumbers,length,sizeof(char*),compare);
for(int i=0;i<length;++i)
printf("%s",strNumbers[i]);
printf("\n");
}
void Test(char* testName, int* numbers, int length, char* expectedResult)
{
if(testName != NULL)
printf("%s begins:\n", testName);
if(expectedResult != NULL)
printf("Expected result is: \t%s\n", expectedResult);
printf("Actual result is: \t");
PrintMinNumber(numbers, length);
printf("\n");
}
void Test1()
{
int numbers[] = {3, 5, 1, 4, 2};
Test("Test1", numbers, sizeof(numbers)/sizeof(int), "12345");
}
void Test2()
{
int numbers[] = {3, 32, 321};
Test("Test2", numbers, sizeof(numbers)/sizeof(int), "321323");
}
void Test3()
{
int numbers[] = {3, 323, 32123};
Test("Test3", numbers, sizeof(numbers)/sizeof(int), "321233233");
}
void Test4()
{
int numbers[] = {1, 11, 111};
Test("Test4", numbers, sizeof(numbers)/sizeof(int), "111111");
}
void Test5()
{
int numbers[] = {321};
Test("Test5", numbers, sizeof(numbers)/sizeof(int), "321");
}
void Test6()
{
Test("Test6", NULL, 0, "Don't print anything.");
}
int main()
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
return 0;
}