从何时你也忌讳空山无人,从何时开始|

Drunker•L

园龄:4个月粉丝:0关注:0

179. 最大数

最大数
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例 1:

输入:nums = [10,2]
输出:"210"

示例 2:

输入:nums = [3,30,34,5,9]
输出:"9534330"

思路

这道题和 LCR 164.破解闯关密码 完全一致,所以解法也是一致的,归根结底是比较:str1 + str2str2 + 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"}为例,排序过程如下:

我们一一比较每对字符串 ab,并按自定义规则进行排序。比如对比 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 中国大陆许可协议进行许可。

posted @   Drunker•L  阅读(14)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起