当前位置:编程学习 > C/C++ >>

把数组排成最小的数。

68.把数组排成最小的数。
题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
例如输入数组{32,  321},则输出这两个能排成的最小数字32132。
请给出解决问题的算法,并证明该算法。
分析:这是09年6月份百度的一道面试题,
从这道题我们可以看出百度对应聘者在算法方面有很高的要求。

 

 


[cpp]
/*
  Name: 
  Copyright: 
  Author: 
  Date: 25-06-11 15:19
  Description: 把数组排成最小的数(数组、算法)。
题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中
最小的一个。
例如输入数组{32, 321},则输出这两个能排成的最小数字32132。
请给出解决问题的算法,并证明该算法。
*/ 
#include<iostream>  
#include<iomanip>  
using namespace std; 
#define N 10    //总共有N个整数   
bool  cmp_min(char *s1,char *s2) 
//算法保证,s1、s2都不是空串    

   const int slen1=strlen(s1); 
   const int slen2=strlen(s2); 
   char *tc=(char *)malloc(slen1+slen2+1);//只开辟一个空间   
   int i; 
   for(i=0;i<slen2;++i) 
   tc[i]=s2[i]; 
   for(;i<slen1+slen2;++i) 
   tc[i]=s1[i-slen2]; 
   tc[i]='\0'; 
   for(i=0;i<slen1;++i) 
   { 
      if(s1[i]==tc[i]) 
      continue; 
      else 
      { 
          if(s1[i]>tc[i]) 
          return false; 
          else 
          return true; 
      } 
   } 
   for(;i<slen1+slen2;++i) 
   { 
      if(s2[i-slen1]==tc[i]) 
      continue; 
      else 
      { 
          if(s1[i-slen1]>tc[i]) 
          return false; 
          else 
          return true; 
      } 
   } 
   return false; 
}  
 
int sort_partition(char *s[],int p,int r) 

    char *x=s[r]; 
    int i=p-1; 
    int j; 
    char *tem; 
    for(j=p;j<r;++j) 
    { 
       if(cmp_min(s[j],x)) 
       { 
          tem=s[++i]; 
          s[i]=s[j]; 
          s[j]=tem; 
       } 
    } 
    tem=s[++i]; 
    s[i]=x; 
    s[r]=tem; 
    return i; 

 
void quick_sort(char *s[],int p,int r) 

     int m; 
     if(p<r) 
     { 
         m=sort_partition(s,p,r); 
         quick_sort(s,p,m-1); 
         quick_sort(s,m+1,r);     
     } 
      

int main() 

    //z总共有N个整数   
    int a[N]={123,43,565,1,67,234,9012,1056,2056,2249}; 
    char *s[N];//指针数组   
    for(int i=0;i<N;++i) 
    {//转换为N个字符串   
      s[i]=(char *)malloc(sizeof(char)*12); 
      //一个整数用11为来表示   
      itoa(a[i],s[i],10); 
      //包含'\0'   
    } 
    for(int i=0;i<N;i++) 
    { 
       cout<<s[i]<<"  "; 
    } 
    quick_sort(s,0,9); 
    cout<<endl; 
    for(int i=0;i<N;i++) 
    { 
       cout<<s[i]<<"  "; 
    } 
    system("pause"); 
    return 0; 

/*
  Name:
  Copyright:
  Author:
  Date: 25-06-11 15:19
  Description: 把数组排成最小的数(数组、算法)。
题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中
最小的一个。
例如输入数组{32, 321},则输出这两个能排成的最小数字32132。
请给出解决问题的算法,并证明该算法。
*/
#include<iostream>
#include<iomanip>
using namespace std;
#define N 10    //总共有N个整数
bool  cmp_min(char *s1,char *s2)
//算法保证,s1、s2都不是空串 
{
   const int slen1=strlen(s1);
   const int slen2=strlen(s2);
   char *tc=(char *)malloc(slen1+slen2+1);//只开辟一个空间
   int i;
   for(i=0;i<slen2;++i)
   tc[i]=s2[i];
   for(;i<slen1+slen2;++i)
   tc[i]=s1[i-slen2];
   tc[i]='\0';
   for(i=0;i<slen1;++i)
   {
      if(s1[i]==tc[i])
      continue;
      else
      {
          if(s1[i]>tc[i])
          return false;
          else
          return true;
      }
   }
   for(;i<slen1+slen2;++i)
   {
      if(s2[i-slen1]==tc[i])
      continue;
      else
      {
          if(s1[i-slen1]>tc[i])
          return false;
          else
        

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,