179. 最大数
最大数
给定一组非负整数 nums
,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2]
输出:"210"
示例 2:
输入:nums = [3,30,34,5,9]
输出:"9534330"
思路
这道题和 LCR 164.破解闯关密码 完全一致,所以解法也是一致的,归根结底是比较:str1 + str2
和str2 + str1
谁比较大。
class Solution {
public String largestNumber(int[] nums) {
// 将整数数组转化为字符串数组
String[] str = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
str[i] = String.valueOf(nums[i]);
}
// 按照自定义规则排序
Arrays.sort(str, (a, b) -> (b + a).compareTo(a + b));
// 如果排序后的数组第一个元素是 "0",那么整个结果就是 "0"
if (str[0].equals("0")) {
return "0";
}
// 拼接排序后的字符串数组
StringBuilder result = new StringBuilder();
for (String s : str) {
result.append(s);
}
return result.toString();
}
}
解释一下自定义排序规则的运行逻辑:
以str = {"3", "30", "34", "5", "9"}
为例,排序过程如下:
我们一一比较每对字符串 a
和 b
,并按自定义规则进行排序。比如对比 a = "3"
和 b = "30"
时,首先计算:
b + a = "30" + "3" = "303"
a + b = "3" + "30" = "330"
然后比较 "303"
和 "330"
:
"330"
>"303"
,所以"3"
应该排在"30"
前面。
我们继续这个过程,逐对比较数组中的元素:
比较 "3"
和 "34"
:
b + a = "34" + "3" = "343"
a + b = "3" + "34" = "334"
比较 "343"
和 "334"
:
"343"
>"334"
,所以"34"
应该排在"3"
后面。
比较 "3"
和 "5"
:
b + a = "5" + "3" = "53"
a + b = "3" + "5" = "35"
比较 "53"
和 "35"
:
"53"
>"35"
,所以"5"
应该排在"3"
前面。
比较 "3"
和 "9"
:
b + a = "9" + "3" = "93"
a + b = "3" + "9" = "39"
比较 "93"
和 "39"
:
"93"
>"39"
,所以"9"
应该排在"3"
前面。
通过这些比较,我们会得到如下的排序顺序:
str = {"9", "5", "34", "3", "30"};
总的来说就是比较谁应该排在最前面的问题。优化的思路自然也就是所采用的排序算法之间的比较
本文作者:Drunker•L
本文链接:https://www.cnblogs.com/drunkerl/p/18634104
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步