题目描述
给定一组非负整数(每个非负整数大小为 0-1000),重新排列它们的顺序使之按照下标顺序
输出后组成一个最大的整数。
示例 1:
输入: 10 2
输出: 210
示例 2:
输入: 3 30 34 5 9
输出: 9534330
说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数
题目分析
- 通过分析我们可以知道,最后得到的结果是直接输出一个数组。
- 首先,由于要确定最大数,故应该知道每个数的位数,及每个数的最高位的大小
- 大体思想类似于冒泡排序。首先比较前两个数谁排在前面比较小,比较小的排在后面,之后又和后面的一位数比较,直到比较到数组的尾部,即将排序时,排在前面最小的数沉底。
- 这里的关键是如何得到每个数的位数,以及如何知道两个数之间比较,如何知道谁排在前面会比较大。
获取每个数的位数
- 这里通过一个while循环进行计算
int getNumber(int n)//计算数字是几位数
{
int ret=0;
int i=1;
while(n/i)
{
i=i*10;
ret++;
}
return ret;//返回数字的位数
}
实现排序的算法
- 这里的核心部分是两个数的比较,这里通过上面的计算已经获得了两个数的位数,则可以先除一定的数得商,再将得到的商除10取余就可以得到了所要比较的比较位。
- 在比较时,一定是谁比较位先出现较小的情况时,该数放在前面会导致比较小。
- 若出现比较位相同的情况,则都向后挪一位比较。
- 直到比较完为止。
// 请实现排序算法
int *resort(int nums[], int n)
{
int i,j;
int x1,x2;//x1和x2是在进行比较的数字中其中一位数
int fig1,fig2;//比较数字的位数
int ret,count;
for(i=0;i<n;i++)//利用冒泡进行比较
{
for(j=0;j+1<n;j++)
{
ret=0;
count=1;
fig1=getNumber(nums[j]);//获得第一个比较数的位数大小
fig2=getNumber(nums[j+1]);//获得第二个比较数的位数大小
x1=nums[j]/(int)pow(10,fig1-count);//获得比较数字中比较位数上的数字
x2=nums[j