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;

	}





















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