• 把整数排成最小的数——剑指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("
    ");
        for(int i=0;i<length;i++)
            delete [] strNumbers[i];
        delete[] strNumbers;
    }
    
    int numbers[3]={3,321,32};
    
    void main()
    {
        PrintMinNumber(numbers,3);
    }
  • 相关阅读:
    java,for穷举,经典题目,百马百担
    《DSP using MATLAB》Problem 5.27
    《DSP using MATLAB》Problem 5.24-5.25-5.26
    《DSP using MATLAB》Problem5.23
    《DSP using MATLAB》Problem 5.22
    《DSP using MATLAB》Problem 5.21
    《金婚》截图
    《DSP using MATLAB》Problem 5.20
    《DSP using MATLAB》Problem 5.19
    《DSP using MATLAB》Problem 5.18
  • 原文地址:https://www.cnblogs.com/wy1290939507/p/4720848.html
Copyright © 2020-2023  润新知