最大數
題目描述:給定一組非負整數
nums
,重新排列每個數的順序(每個數不可拆分)使之組成一個最大的整數。注意:輸出結果可能非常大,所以你需要返回一個字串而不是整數。
示例說明請見LeetCode官網。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法一:陣列排序
首先,通過排序將給定的nums排序好,排序邏輯是通過一個比較器實現的,就是比較2個數正向連線和反向連線哪個比較大,然後按順序將排序後的陣列連線起來即可。
備註:邏輯比較清晰,但是還是提交了多次才提交成功,主要遇到以下兩個問題:
- 沒考慮很大的數的情況,使用Integer導致越界了,改成Long才對;
- 沒考慮拼接後的數字首的0是無意義的,需要去掉。
這兩點都很基礎,以後注意。
import java.util.Arrays;
public class LeetCode_179 {
public static String largestNumber(int[] nums) {
String[] numsStr = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
numsStr[i] = String.valueOf(nums[i]);
}
Arrays.sort(numsStr, (o1, o2) -> {
if (Long.valueOf(o1 + o2) > Long.valueOf(o2 + o1)) {
return 1;
} else if (Long.valueOf(o1 + o2) < Long.valueOf(o2 + o1)) {
return -1;
} else {
return 0;
}
});
StringBuilder result = new StringBuilder();
for (int i = numsStr.length - 1; i >= 0; i--) {
result.append(numsStr[i]);
}
// 找到第一個不為0的數字
int index = 0;
for (char c : result.toString().toCharArray()) {
if (c != '0') {
break;
}
index++;
}
return index == result.length() ? "0" : result.substring(index);
}
public static void main(String[] args) {
int[] nums = new int[]{10, 2};
// 測試用例1,期望輸出: 210
System.out.println(largestNumber(nums));
int[] nums2 = new int[]{3, 30, 34, 5, 9};
// 測試用例2,期望輸出: 9534330
System.out.println(largestNumber(nums2));
int[] nums3 = new int[]{999999991, 9};
// 測試用例3,期望輸出: 9999999991
// 考慮越界問題
System.out.println(largestNumber(nums3));
int[] nums4 = new int[]{0, 0};
// 測試用例4,期望輸出: 0
// 考慮結果中的字首0
System.out.println(largestNumber(nums4));
}
}
【每日寄語】 不在沉默中爆發,就在沉默中滅亡。