Largest Number
題意:
Given a list of non negative integers, arrange them such that they form the largest number.
Example
Given [1, 20, 23, 4, 8], the largest formed number is 8423201.
Note
The result may be very large, so you need to return a string instead of an integer.
解題思路:
網友 cherylintcode 提供以下思路:
- 先將所有數字轉成字串
- 使用特製的 comparator,將兩個字串的組合作排序,如比較 23 與 4 ,他們有兩種組合 lr(423) 與 rl(234),接著再透過 字串的 compareTo 函數來比較兩者的 ascii 值,較小的在前,較大在後。
- 字串陣列排序完後,從後往前不斷的將元素 append 到 string builder上。
- 返回答案即可。
為了防止 [0, 0] 的情況,記得在最後輸出前,檢查第一位是否為0 ,若是則返回0 ,否則返回 res。
程式碼如下:
public class Solution {
/**
*@param num: A list of non negative integers
*@return: A string
*/
public String largestNumber(int[] num) {
if (num == null || num.length == 0) {
return "";
}
int len = num.length;
String[] numString = new String[len];
for (int i = 0; i < len; i++) {
numString[i] = String.valueOf(num[i]);
}
Arrays.sort(numString, new stringComparator());
// 因是由小到大,我們需要從後面開始append
StringBuilder sb = new StringBuilder();
for (int i = len - 1; i >= 0; i--) {
sb.append(numString[i]);
}
// 防止 [0, 0] 這種情況
if (sb.charAt(0) == '0') {
return "0";
}
return sb.toString();
}
// 拿兩個值的組合來作排序,看哪個較小就排前面。
class stringComparator implements Comparator<String> {
public int compare(String s1, String s2) {
String lr = s1 + s2;
String rl = s2 + s1;
return lr.compareTo(rl);
}
}
}