把数组排成最小的数

来源:互联网 发布:伺服控制系统编程 编辑:程序博客网 时间:2024/06/06 03:55
/******************************************************************题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字32132。******************************************************************/#include <stdio.h>#include <string.h>#include <algorithm>int compare(const void* strNumber1, const void* strNumber2);// int型整数用十进制表示最多只有10位const int g_MaxNumberLength = 10; char* g_StrCombine1 = new char[g_MaxNumberLength * 2 + 1];char* g_StrCombine2 = new char[g_MaxNumberLength * 2 + 1]; 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");     for(int i = 0; i < length; ++i)        delete[] strNumbers[i];    delete[] strNumbers;} // 如果[strNumber1][strNumber2] > [strNumber2][strNumber1], 返回值大于0// 如果[strNumber1][strNumber2] = [strNumber2][strNumber1], 返回值等于0// 如果[strNumber1][strNumber2] < [strNumber2][strNumber1], 返回值小于0int compare(const void* strNumber1, const void* strNumber2){    // [strNumber1][strNumber2]    strcpy(g_StrCombine1, *(const char**)strNumber1);//这里转换的时候不能用(const char*)?,我试了下是可以的    strcat(g_StrCombine1, *(const char**)strNumber2);     // [strNumber2][strNumber1]    strcpy(g_StrCombine2, (const char*)strNumber2);    strcat(g_StrCombine2, (const char*)strNumber1);     return strcmp(g_StrCombine1, g_StrCombine2);}// ====================测试代码====================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;}


用string类

bool compare(string str1, string str2){string combbination1 = str1 + str2;string combbination2 = str2 + str1;return combbination1 < combbination2;}void PrintMinNumber(int* arr, int length){string* numbers = new string[length];for(int i=0; i<length; ++i){stringstream strstream;strstream << arr[i];strstream >> numbers[i];}sort(numbers, numbers+length, compare);for(int i=0; i<length; ++i){cout << numbers[i];}delete[] numbers;}


==参考剑指offer

0 0
原创粉丝点击