把整数排成最小的数——剑指offer面试题33

题目:输入一个正整数数组,把数组中所有的数拼接成一个整数,输出最小的整数。

思路:设计一种新的比较规则来排序一个数组,证明这个比较规则有效。

(1)两个数m,n,如果mn<nm,则说明m << n。证明按这个顺序排序得到的数是最小的数。

即如如果x1 << x2 << x3 << x4,则x1x2x3x4是最小的数。

证明:假如任意交换其中的2个数x2和x4,x1x2x3x4x5<<x1x2x4x3x5<<x1x4x2x3x5<<x1x4x3x2x5.

(2)为了方便排序,证明了这个排序方法还有一个传递性,即若a<<b,b<<c,则a<<c。

(3)为了避免大数的溢出问题,可以采用字符串的方法进行比较。

 qsort:void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));

参数: 1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序
//输入一个正整数数组,把数组中的而所有数字拼接起来组成一个最小的整数。
#include<string.h>
#include<stdio.h>
#include<stdlib.h>    //qsort需要的头文件

const int g_MaxNumberLength=10;
char* g_strConbine1=new char[g_MaxNumberLength*2+1];
char* g_strConbine2=new char[g_MaxNumberLength*2+1];
int compare(const void* strNumber1,const void*strNumber2)   //
{
    strcpy(g_strConbine1,*(const char**)strNumber1);
    strcat(g_strConbine1,*(const char**)strNumber2);
    strcpy(g_strConbine1,*(const char**)strNumber2);
    strcat(g_strConbine1,*(const char**)strNumber1);
    return strcmp(g_strConbine1,g_strConbine2);
}
void PrintMinNumber(int* numbers,int length)
{
    if(numbers==NULL||length<=0)
        return;
    char** strNumbers=(char**)(new int[length]);   //new int[length]用来存储cahr*型指针
    for(int i=0;i<length;i++)
    {
        strNumbers[i]=new char[g_MaxNumberLength+1];  //strNumbers[i]为char*型指针
        sprintf(strNumbers[i],"%d",numbers[i]);
    }
    qsort(strNumbers,length,sizeof(char*),compare);     //void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
    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 numbers[3]={3,321,32};

void main()
{
    PrintMinNumber(numbers,3);
}

 

posted @ 2015-08-11 14:02  wy1290939507  阅读(174)  评论(0编辑  收藏  举报