LeetCode - 179. Largest Number

這道題目的解答非常聰明而巧妙,我們先來看下面的一個例子:

str1 = "338"

str2 = "9"

s1 = str1 + str2 = "3389"

s2 = str2 + str1 = "9338"

明顯9338 > 3389,所以這時我們選擇str2在前是明智的。

根據上面的分析,我們可以設計出一個比較大小的規則,使得如果上面的情況發生的話,有str1 < str2,而Java中的Comparator<>接口提供了這種功能,因爲Comparator是一個接口,不能對它進行實例化,所以我們可以在題目中給出的Solution類中新建一個內部類stringComp或者使用匿名類來實現這個我們需要的類。

要新建一個類實現Comparator接口的話,需要在類中添加並實現一個方法int compare(T t1, T t2)。在這一步做出之後,剩下的就簡單了,只需要調用Arrays.sort()函數並且使用StringBuilder把所有的String連接在一起即可,代碼如下:

public class Solution {
    class stringComp implements Comparator<String>{
        @Override
        public int compare(String str1, String str2){
            String s1 = str1 + str2;
            String s2 = str2 + str1;
            return s2.compareTo(s1);
        }
    }
    
    public String largestNumber(int[] nums) {
        if(nums == null || nums.length == 0) return "";
        
        // Convert int to String
        String[] numsString = new String[nums.length];
        for(int i = 0; i < nums.length; i++){
            numsString[i] = String.valueOf(nums[i]);
        }
        
        // Sort String based on self-defined rull
        Arrays.sort(numsString, new stringComp());
        
        // An extreme corner case by lc, say you have only a bunch of 0 in your int array
        if(numsString[0].charAt(0) == '0') return "0";
        
        // Construct answer
        StringBuilder sb = new StringBuilder();
        for(String s : numsString){
            sb.append(s);
        }
        return sb.toString();
    }
}

注意在實現compare函數的時候,我們並不是使用s1.compareTo(s2),而是使用s2.compareTo(s1),因爲Arrays.sort是默認從小到大排序的,我們需要的是從大到小,所以使用了這裏的一個小技巧。

知識點:

1. 這道題目裏的知識點很多了,大部分是關於Java的,最重要的就是自定義比較函數的方法,Arrays.sort(Object[], Comparator<>),Comparator的使用

2. 注意將int轉化爲String的方法,String.valueOf(int i)就把int變成了相對應的String

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