Largest Number
Given a list of non negative integers, arrange them such that they form the largest number.
For example, given [3, 30, 34, 5, 9]
, the largest formed number is9534330
.
Note: The result may be very large, so you need to return a string instead of an integer.
想到的第一个方案就是,以每个数组的第一个数字大小进行排序,然后比出大小,长度为1的按大小放在前面。之后再根据第二个数字进行二次排序,再比出大小如上一次。
但是效率上显然不高,有很多数字都参加了多次比较。
所以想到了改进方案。就是把排序的规则改变一下,比如平常是用> 或<号,我们写一个方法来进行比较。这样最优的时间复杂度就接近排序算法的了。
这里选择归并排序。因为这个效率上的表现还不错。
所以现在问题变成了怎么最高的效率比较这样两个数
private static boolean compare(int a, int b) {
}
又想到了几种方案:
第一种把两个数变同样数量级的。比如:5,30.变成50和30直接比大小即可,或者缩小也可以。
第一种改进版本:把两个数变成同一数量级。比如30和230都变成3和2.3.但是相对来说运算就多了。但是实现简单。
第二种就是用charat(int index)一个一个比。
明显第一个来说相对简单点。
那么如何来判断两个数之间的数量级差呢。
第一个想到的当然是长度,但是长度则需要先转化成字符串再遍历。效率低下。
第二个想到的是做运算。
a/10和b/10;取整数位比较。
private static boolean compare(int num1, int num2) {
float a = (float) num1;
float b = (float) num2;
if (a >= 10 || b >= 10) {
while (a >= 10) {
a /= 10;
}
while (b >= 10) {
b /= 10;
}
return a >= b;
}
return a >= b;
}
写出来 的第一段比较代码
然后测试输出是:
[6, 4, 4, 4, 3, 23, 2, 2, 10]
感觉 是对了。但是跑了下之后。。。
然后发现不适配 121 和12 这两个数
应该是12121
但是算出来是12112,因为一个是1.21 一个是1.2所以1.21放在了前面
之后又写出了
让他们变成整数再比较的变成12121和12112再比。。
后来一想完全没必要。直接比字符串就行了。。
private static boolean compare(int num1, int num2) {
String a = num1 + "" + num2;
String b = num2 + "" + num1;
for (int i = 0; i < a.length(); i++) {
if (a.charAt(i) > b.charAt(i)) {
return true;
} else if (a.charAt(i) < b.charAt(i)) {
return false;
}
}
return false;
}