CS-Notes全部笔记在阅读器中打开

45. 把数组排成最小的数

题目链接

Leetcode

题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组 {3,32,321},则打印出这三个数字能排成的最小数字为 321323。

解题思路

可以看成是一个排序问题,在比较两个字符串 S1 和 S2 的大小时,应该比较的是 S1+S2 和 S2+S1 的大小,如果 S1+S2 < S2+S1,那么应该把 S1 排在前面,否则应该把 S2 排在前面。例如 3 和 32 拼接得到 332 和 323,323 更小,所以 32 排在 3 前面。

这个比较规则可以直接用于排序,是因为它等价于比较每个数字无限重复后得到的小数,例如 3 对应 0.333…,32 对应 0.3232…,后者更小。实数的大小关系有传递性,所以不会出现 a 在 b 前、b 在 c 前、c 又在 a 前的矛盾。

public String crackPassword(int[] password) {
    if (password == null || password.length == 0)
        return "";
    int n = password.length;
    String[] nums = new String[n];
    for (int i = 0; i < n; i++)
        nums[i] = password[i] + "";
    Arrays.sort(nums, (s1, s2) -> (s1 + s2).compareTo(s2 + s1));
    StringBuilder ret = new StringBuilder();
    for (String str : nums)
        ret.append(str);
    return ret.toString();
}

在阅读器中可以用目录和搜索、切换深色模式、练习这篇笔记中的面试题:打开《45. 把数组排成最小的数》