【OJ题目】把数组排成最小的数

论坛 期权论坛 脚本     
匿名网站用户   2020-12-19 15:21   11   0

题目描述:

给输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。

样例输入1:

{2,1}

样例输出1:

12

样例输入2:

{32,321}

样例输出2:

32132

样例输入3:

{4589,101,41425,9999}

样例输出3:

1014142545899999;

接口说明:

intsmallestDigit(inta[],intnCount,char*strRst)

功能:将输入的数组排成最小的数
输入:inta[]:整型数组

intnCount:数组长度

char*strRst返回值
输出:无
返回:成功返回0异常返回-1

这道题目用冒泡排序就能解决,但是判断的条件不是比数值,而是:

如果((A排在B后面形成的数)> (A排在B前面形成的数))做(A/B交换),巧妙之处,也在于此;

#include <stdlib.h>
#include <string.h>
#include "oj.h"


//判断两个字符串是否需要交换
bool needExchange(char* s1, char* s2) 
{
  char *t1 = (char*)malloc(33);
  char *t2 = (char*)malloc(33);
          strcpy(t1,s1);
  strcat(t1,s2);

  strcpy(t2,s2);
  strcat(t2,s1);
     if(strcmp(t1, t2) > 0)
   return true;
  else
   return false;
}

// 功能:将输入的数组排成最小的数
// 输入: int a[]:整型数组
//        int nCount:数组长度
//        char * strRst 返回值
// 输出:
// 返回:成功返回0  异常返回-1

int  smallestDigit(int a[],int nCount,char * strRst)
{
    char s[100][33];
 char *ss[100]; //用来记录每个字符串的起始指针,实际只需要交换起始指针即可
 int i,j,n;
 char *t;
 n = nCount;
 for(i=0; i<nCount; i++)
 {
  if(a[i]<=0)
   return -1;
  else
         itoa(a[i], s[i], 10);
 }
 for(i=0; i<nCount; i++)
 {
  ss[i] = &s[i][0];
 }
 for(i=0; i<n; i++)
 {
  for(j=0; j<nCount-1; j++)
  {
   if(needExchange(ss[j],ss[j+1]))
   {
    t = ss[j];
    ss[j] = ss[j+1];
    ss[j+1] = t;
    //n = j; 
    /*这里我想当然的还像普通冒泡排序一样,记录最后一次交换的位置;
    实际不是这样的,要把每一个元素都遍历到,比如{1590,24,22},看似1590沉到底了,但是后来的24和22还是要交换的*/
   }
  }
 }
 for(i=0; i<nCount; i++)
 {
  strcat(strRst, ss[i]);
 }
 return 0;
}


测试用例:

void CExampleTest::TestCase01()
{    
 int a[] = {1234,123,120,11,1540,234,32,321,322,323,324};
 char szRst[100]  = {0};
 char *strExpect = "111201231234154023432132232323324";
 smallestDigit(a,11,szRst);
 CPPUNIT_ASSERT(0 == strcmp(szRst,strExpect));
}

// 在这里添加测试用例实现
void CExampleTest::TestCase02()
{    
 int a[] = {32, 321,324};
 char szRst[100]  = {0};
 char *strExpect = "32132324";
 smallestDigit(a,3,szRst);
 CPPUNIT_ASSERT(0 == strcmp(szRst,strExpect));
}



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP