把数组排成最小的数

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

分析:最直接做法是先求出这个数组中所有数字的全排列,然后把每个排列拼起来,求拼起来数字最小的一个。这样做时间复杂度太高。

    其实这道题是要我们找到一个排序规则,数组根据这个规则排序之后就能排成一个最小的数字。这个规则应该是两个数字m,n,如果mn<nm则定义m小于n,反之nm<mn则定义n小于m.如果mn=nm则定义n等于m。同时考虑大数问题,有可能拼接起来后超出int型的表示范围。所以将数字转换成字符串。由于mn和nm的位数相同,只需要通过字符串大小比较就可以。

实现如下:其时间复杂度为O(nlogn)。

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 1=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;
}

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);
}


本文出自 “仙路千叠惊尘梦” 博客,请务必保留此出处http://secondscript.blog.51cto.com/9370042/1586553

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。