一、题目描述
1.1 题目
-
最大数
-
给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。
-
示例 1:
输入: [10,2]
输出: 210
- 示例 2:
输入: [3,30,34,5,9]
输出: 9534330
- 说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。
1.2 知识点
- 排序
1.3 题目链接
二、解题思路
2.1 解题思路
这道题本质就是一个排序问题,通过排序让数组中的元素拼接后组成一个最大数,因此只需要定义比较器逻辑即可,首先将其转换为字符串数组,然后依次判断相邻的两个字符串的关系,设前后两个字符串分别为 sa 和 sb,如果将其颠倒拼接后的 sb+sa 大于正序的 sa+sb,那么就将其进行位置调换(本质是冒泡排序)。
需要注意的是当排序完成后如果数组的首位为 0 则说明当前组成的最大整数为零,可以直接忽略后面的其余位(比如对于排序后的结果时 [0, 0] 这种情况),因此直接返回 0 即可。
三、实现代码
3.1 解题实现
class Solution {
public String largestNumber(int[] nums) {
String[] str = new String[nums.length];
String ret = "";
for(int i = 0; i < nums.length; i++)
str[i] = String.valueOf(nums[i]);
// 自定义比较器 Comparator
Arrays.sort(str, new Comparator<String>() {
public int compare(String sa, String sb){
return (sb + sa).compareTo(sa + sb);
}
});
for(String s : str)
ret += s;
return ret.charAt(0) == '0' ? "0" : ret;
}
}