【剑指Offer系列】45-把数组排成最小的数(sort排序字符串a+b和b+a)

本文介绍了一种算法,用于将一组非负整数重新排列,形成一个可能非常大的最大整数。通过示例展示了如何使用Java的sort排序Comparator接口实现这一目标,包括处理特殊场景如全零输入。

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

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

示例 1:
输入:nums = [10,2]
输出:“210”

示例 2:
输入:nums = [3,30,34,5,9]
输出:“9534330”

示例 3:
输入:nums = [999999998,999999997,999999999]
输出:“999999999999999998999999997”

示例 4:
输入:nums = [1,2,3,4,5,6,7,8,9,0]
输出:“9876543210”

示例 5:
输入:nums = [0,0]
输出:“0”

思路:

正常来讲,可以使用dfs,类似abc排序[abc,acb,bac,bca,cab,cba],然后去排序后的数值最大值。
但是一看到示例4,立马放弃dfs排列,因为大概率会超时

实现方式:java的sort排序Comparator接口

list:[1,10,2,6,4]
数字排序:list.stream().sorted((o1, o2) -> o2 - o1)

list:[“1”,“10”,“2”,“6”,“4”]
list.stream().sorted((o1, o2) -> o2.compareTo(o1))

本题是将list中字符串数字,排序组成大的数[“321”,“3”],我们期望的是3321 > 3213
所以,这里不能单单的是(o1, o2) -> o2.compareTo(o1),因为这种排序,肯定把321这个大的排在3这个小的前形成3213。此时需要:

(o1, o2) -> (o2 + o1).compareTo(o1 + o2)
这种排序,会判断3213 和 3321的大小,显然3321 > 3213,会把3放在前面,321放在后面

code
class Permutation123LargerNum{
    public String largestNumber(int[] arr) {
        if (arr == null || arr.length == 0) {
            return "";
        }
        if (arr.length == 1) {
            return String.valueOf(arr[0]);
        }
        String s = Arrays.stream(Arrays.stream(arr).boxed().toArray()).map(String::valueOf)
                .sorted((o1, o2) -> (o2 + o1).compareTo(o1 + o2)).collect(Collectors.joining());
        // 这里主要是针对示例5,s = "00"的场景
        return s.charAt(0) == '0' ? "0" : s;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值