leetcode 之Largest Number


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;

	}





















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章