1. 程式人生 > >【Leetcode】179. Largest Number

【Leetcode】179. Largest Number

class 數組 new 需要 for ++ ret instead app

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 is 9534330.

Note: The result may be very large, so you need to return a string instead of an integer.

分析:給定一個正整數數組,將數組的數字整合成一個最大的數字。

樣例:① [3, 30, 34, 5, 9]

->9534330

   ②[121,12]->12121

   ③[0,0] -> 0

(1)將數組的數字組合,這隱含著一個大數問題,所以不可以直接用int或者long來保存結果,需要用到字符串(也可以用數組).

(2)字符串m與字符串n拼接,可以成為mn或者nm。要比較mn與nm的大小,不能直接用Arrays.sort()函數,這個函數排序後的結果為升序,重寫Comparator 實現降序,才能組成最大的數字。

(3)字符串m與n的大小比較規則:當mn>nm時,m>n;

                當mn=nm時,m=n;

                當mn<nm時,m<n;

(4)字符串的比較規則:str1="abcda";str2="abcdb";當比較到第五個字符str1為a,str2為b 。a的ASCII碼小於b的ASCII碼。所以str1<str2

下面的代碼 直接使用 Arrays.sort(com, new Comparator<Object>() { .....});在sort函數中重寫 Comparator<Object>(),效率略低。跑完leetcode上的樣例需要334ms。

public String largestNumber(int[] nums) {
        if (nums == null
) return null; int len = nums.length; String[] com = new String[len]; int all0 = 0; for (int i = 0; i < len; i++) { if (nums[i] == 0) { all0++; System.out.println("~~~" + all0); } com[i] = Integer.toString(nums[i]); } Arrays.sort(com, new Comparator<Object>() { public int compare(Object obj1, Object obj2) { String str1 = (String) obj1; String str2 = (String) obj2; String com1 = str1 + str2; System.out.println("com1:" + com1); String com2 = str2 + str1; System.out.println("com2:" + com2); if (com1.compareTo(com2) >= 0) { System.out.println("com1<com2"); return -1; } else { System.out.println("com1>com2"); return 1; } } }); String ans = ""; for (int i = 0; i < len; i++) { ans += com[i]; } if (all0 == len) ans = "0"; return ans; }

做出以下改進 拍完樣例的時間為120ms

Comparator<String> comp = new Comparator<String>() {
            @Override
            public int compare(String str1, String str2) {
                String s1 = str1 + str2;
                String s2 = str2 + str1;
                return s2.compareTo(s1);
                // reverse order here, so we can do append() later
            }
        };
        Arrays.sort(com, comp);

【Leetcode】179. Largest Number