最大数
难度:
标签:
题目描述
给定一组非负整数 nums
,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:
nums = [10,2]
输出:"210"
示例 2:
输入:
nums = [3,30,34,5,9]
输出:"9534330"
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 109
代码结果
运行时间: 20 ms, 内存: 15.9 MB
/* 思路:
* 使用 Java Stream API,首先将整数数组转换为字符串数组,
* 然后定义一个自定义比较器根据拼接结果排序,
* 最后使用 Collectors.joining() 将排序后的数组拼接成结果字符串。
*/
import java.util.Arrays;
import java.util.stream.Collectors;
public class Solution {
public String largestNumber(int[] nums) {
// 将数字数组转换为字符串数组并排序
String result = Arrays.stream(nums)
.mapToObj(String::valueOf)
.sorted((a, b) -> (b + a).compareTo(a + b))
.collect(Collectors.joining());
// 如果最大的数字是 0,直接返回"0"
if (result.charAt(0) == '0') {
return "0";
}
return result;
}
}
解释
方法:
这个题解的思路是将数组中的数字转换为字符串,然后通过自定义的比较函数对字符串进行排序。比较函数的规则是,比较两个字符串 x 和 y 拼接后的大小,如果 x+y > y+x,则 x 排在前面;如果 x+y < y+x,则 y 排在前面;如果相等,则顺序不变。排序后,将字符串数组拼接起来即可得到最大数。如果排序后的第一个元素为 '0',说明所有数字都为 0,直接返回 '0'。
时间复杂度:
O(nlogn)
空间复杂度:
O(n)
代码细节讲解
🦆
在自定义比较函数中,为什么`x+y > y+x`的条件能决定x应该排在y前面?
▷🦆
如果nums数组中的数位长度不同,如何保证比较的公平性和准确性?
▷🦆
在处理大量数据时,字符串排序的操作是否会受到字符串长度的影响,具体如何影响排序性能?
▷🦆
自定义比较函数返回的是1, -1和0, 这种设计有什么特别的考虑吗,它与常规的比较函数有何不同?
▷