LeetCode 练习——剑指 Offer 45. 把数组排成最小的数

183 阅读1分钟

1.题目描述

剑指 Offer 45. 把数组排成最小的数

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

 

示例 1:

输入: [10,2]
输出: "102"

示例 2:

输入: [3,30,34,5,9]
输出: "3033459"

 

2.解题思路与代码

2.1 解题思路

题目要求对数组进行排序拼接,拼接后的数字最小。要是组合后的数字最小,就需要将数字最高位越小放在越前面,并且数字相同位数越少的也越靠前,那么我们就需要对数组转换成字符串列表,然后将字符串列表进行排序,对比拼接后的字符串的字典序就可以了,字典序小的在前面,大的靠后,最后将字符串列表拼接起来即可。

2.2 代码

class Solution {
    public String minNumber(int[] nums) {
        StringBuilder builder = new StringBuilder();
        List<String> list = new ArrayList<>();
        for (int num : nums) {
            list.add(String.valueOf(num));
        }
        list.sort((o1, o2) -> {
            String s1 = o1+o2;
            String s2 = o2+o1;
            return s1.compareTo(s2);
        });
        for (String s : list) {
            builder.append(s);
        }
        return builder.toString();
    }
}

2.3 测试结果

通过测试

image.png

3.总结

  • 将数字转换成字符串列表
  • 列表按照字典序进行排序