把数组排成最小的数
来源:互联网 发布:小灰灰淘宝买家采集器 编辑:程序博客网 时间: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");}
0 0
- 把数组排成最小的数--总结
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数--总结
- 把数组排成最小的数--总结
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- HDU Problem 1051 Wooden Sticks 【LIS】
- Foundation框架中的NSArray
- Java7并发编程--4.2、在执行器中执行任务并且返回结果
- 数据结构实验之查找一:二叉排序树
- 史上最易懂的Android jni开发资料--NDK环境搭建
- 把数组排成最小的数
- Lua 多条件排序
- 图结构练习——BFS——从起始点到目标点的最短步数
- Python map
- 深入 char * ,char ** ,char a[ ] ,char *a[] 内核
- android测试:UI automator
- HDU:1025 Constructing Roads In JGShining's Kingdom(LIS-n*logn解法+思维)
- EventBus源码研读
- Java验证码字符串生成