把数组排成最小的数

来源:互联网 发布:小灰灰淘宝买家采集器 编辑:程序博客网 时间:2024/06/18 01:53

最近在看《剑指offer》,其中有道题是这样的:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接的所有数字中最小的一个。例如输入数组{3, 32, 321}, 则打印出这3个数字排成的最小数字321323.

作者给出了一种解决这个问题的方法,思路为把每个数字变成一个字符串,然后通过对拼接后的字符串进行排序从而得到最小的数字。

作者给出来得方法很好,复杂度是(nlog(n)),但需要申请很多内存。

在看这个题的过程中本人发现如果直接将数组根据某种规律排序,然后将排序后的数字依次打印出来就是最小数字了。

具体为通过扩展数字的最后一位使两个数字的位数达到一样,然后比较这两个扩展之后的数字,如3和32,通过扩展3得到33,33>32,所以要将32放在3的前面。

具体代码如下:

int bitNum(int num)//num的位数{if (num < 0){num = -num;}int length = 1;while (num/10){++length;num = num/10;}return  length;}int tempNum(int num, int length)//以num的后面添加length个num的最后一位(如tempNum(57, 2) = 5777){int lastBit = num%10;int temp = num;while (length){temp = temp*10 + lastBit;--length;}return temp;}void swap(int *num1, int *num2)//扩展*num1 > *num2 时, 交换*num1,*num2;{int lenth1 = bitNum(*num1);int lenth2 = bitNum (*num2);int temp1 = *num1;int temp2 = *num2;if (lenth1 < lenth2){temp1 = tempNum(temp1, lenth2-lenth1);}else if(lenth1 > lenth2){temp2 = tempNum(temp2, lenth1-lenth2);}if(temp1 > temp2){int temp = *num1;*num1 = *num2;*num2 = temp;}}void myPrintMinNumber(int* numbers, int length){if(numbers == NULL || length <= 0)return ;for (int i = 0; i < length; i++){for (int j = i+1; j < length; j++){swap(&numbers[i], &numbers[j]);}}for (int i = 0; i < length; i++){printf("%d", numbers[i]);}printf("\n");}


因为用的是冒泡排序,所以时间复杂度是n^2,。如果采用快速排序或者像作者一样使用库函数qsort(),可以将复杂度降低到nlog(n)。



0 0
原创粉丝点击