zoukankan      html  css  js  c++  java
  • 把数组排成最小的数

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

    解析:这个题目最直接的做法应该是先求出这个数组中所有数字的全排列,然后把每个排列拼起来,最后求出拼起来的数字的最小值。根据题目要求,两个数字m和能拼接成数字mn和nm。如果mn<nm,那么我们应该打印出mn,也就是m应该排在n的前面,我们定义此时m<n;反之,如果nm<mn,我们定义n小于m.如果mn=nm,m等于n.(此时可能隐含"大数问题")
      一个非常直观的解决大数问题的方法就是把数字转换为字符串。另外,由于把数字m和n拼接起来得到的mn和nm,他们的位数肯定是相同的,因此比较他们的大小只需要按照字符串大小比较规则就可以了。
     1 const int g_MaxNumberLength=10;
     2 char* g_StrCombine1=new char[g_MaxNumberLength*2+1];
     3 char* g_StrCombine2=new char[g_MaxNumberLength*2+1];
     4 
     5 int compare(const void* strNumber1,const void* strNumber2)
     6 {
     7     strcpy(g_StrCombine1,*(const char**)strNumber1);
     8     strcat(g_StrCombine1,*(const char**)strNumber2);
     9 
    10     strcpy(g_StrCombine2,*(const char**)strNumber2);
    11     strcat(g_StrCombine2,*(const char**)strNumber1);
    12     return strcmp(g_StrCombine1,g_StrCombine2);
    13 }
    14 
    15 void PrintMinNumber(int* numbers,int length)
    16 {
    17     if(numbers==NULL||length<=0)
    18         return;
    19     char** strNumbers=(char**)(new int[length]);
    20     for(int i=0;i<length;++i)
    21     {
    22         strNumbers[i]=new char[g_MaxNumberLength+1];
    23         sprintf(strNumbers[i],"%d",numbers[i]);
    24     }
    25     qsort(strNumbers,length,sizeof(char*),compare);
    26     for(i=0;i<length;++i)
    27         printf("%s",strNumbers[i]);
    28     printf("
    ");
    29     for(i=0;i<length;++i)
    30         delete [] strNumbers[i];
    31           delete [] strNumbers;
    32 }

     

  • 相关阅读:
    python笔记26(正则表达式、re模块)
    python笔记24(回顾、复习)
    python笔记25(正则表达式课程一)
    python笔记23(面向对象课程五)
    python(leetcode)-1.两数之和
    python(leetcode)-283移动零
    python(leetcode)-66加一问题
    python(leetcode)-350两个数组的交集
    python(leetcode)-136只出现一次的数字
    python数据结构-数组/列表/栈/队列及实现
  • 原文地址:https://www.cnblogs.com/wxdjss/p/5484309.html
Copyright © 2011-2022 走看看