本文主要是介绍题目1504:把数组排成最小的数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述:
-
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
- 输入:
-
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数。
输入的第二行包括m个正整数,其中每个正整数不超过10000000。
- 输出:
-
对应每个测试案例,
输出m个数字能排成的最小数字。
- 样例输入:
-
3 23 13 6 2 23456 56
- 样例输出:
-
13236 2345656
看到这个题目,简单分析了下,断定当各个整数的最高位越小的放在前面即可。为了方便操作,选择用字符串存储读入的各个整数。代码如下: -
#include<stdio.h>
#include<string.h>
int
main()
{
int
i,j,flag,m;
char
num[100][10],temp[10];
while
(
scanf
(
"%d"
,&m)!=EOF)
{
for
(i=0;i<m;i++)
scanf
(
"%s"
,num[i]);
for
(i=1;i<m;i++)
{
flag=0;
for
(j=0;j<m-i;j++)
if
(
strcmp
(num[j],num[j+1])>0) //为了编码方便,采用了改进的冒泡排序算法
{
strcpy
(temp,num[j]);
strcpy
(num[j],num[j+1]);
strcpy
(num[j+1],temp);
flag=1;
}
if
(!flag)
break
;
}
for
(i=0;i<m;i++)
printf
(
"%s"
,num[i]);
printf
(
"\n"
);
}
return
0;
}
-
#include<stdio.h>
#include<string.h>
int
main()
{
int
i,j,flag,m;
char
num[100][10],temp1[20],temp2[20];
while
(
scanf
(
"%d"
,&m)!=EOF)
{
for
(i=0;i<m;i++)
scanf
(
"%s"
,num[i]);
for
(i=1;i<m;i++)
{
flag=0;
for
(j=0;j<m-i;j++)
{
strcpy
(temp1,num[j]);
strcpy
(temp2,num[j+1]);
strcat
(temp1,num[j+1]);
strcat
(temp2,num[j]);
if
(
strcmp
(temp1,temp2)>0)
{
strcpy
(temp1,num[j]);
strcpy
(num[j],num[j+1]);
strcpy
(num[j+1],temp1);
flag=1;
}
}
if
(!flag)
break
;
}
for
(i=0;i<m;i++)
printf
(
"%s"
,num[i]);
printf
(
"\n"
);
}
return
0;
}
另外,虽然最先的思路是错误的,但是对于算法性能的进一步优化还是有不小的启示。改进的排序算法代码如下: - for(i=1;i<m;i++)
{
flag=0;
for(j=0;j<m-i;j++)
{
if(num[j][0]>num[j+1][0]) //各个整数的最高位数不同时就可以决定两个数的相对位置
{
strcpy(temp1,num[j]);
strcpy(num[j],num[j+1]);
strcpy(num[j+1],temp1);
flag=1;
}
else if(num[j][0]==num[j+1][0]) //而当两个整数的最高位相同时,因为其位数不同带来比较上的复杂性,我们采用比较ab与ba的大小
{
strcpy(temp1,num[j]);
strcpy(temp2,num[j+1]);
strcat(temp1,num[j+1]);
strcat(temp2,num[j]);
if(strcmp(temp1,temp2)>0)
{
strcpy(temp1,num[j]);
strcpy(num[j],num[j+1]);
strcpy(num[j+1],temp1);
flag=1;
}
}
}
if(!flag) break;
}
-
但是提交结果为WA。细细分析了下,上面的代码只适用于各个整数最高位不同或最高位相同且位数相同的情况,更一般的情况并没有考虑到。思考良久,仍未能找到较好的解决办法,百度查看来博友的文章后,豁然开朗,为了便于这一算法思想对以后的自己能有更深的启发意义,遂在此博文一篇。算法的基本思路是对于a,b两个整数,如果ab<ba,那么就应该将a放在b的前面,依据这一点对数组进行排序即可。改进的代码如下:
这篇关于题目1504:把数组排成最小的数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!