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

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

题目

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

示例 1:

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

链接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof

解题思路:

  • 此题求拼接起来的 “最小数字” ,本质上是一个排序问题。

  • 排序判断规则: 设 nums 任意两数字的字符串格式 x 和 y ,则

    • 若拼接字符串 x + y > y + x,则 x > y;

    • 反之,若 x + y < y + x,则 x < y ;

    • 根据以上规则,套用任何排序方法对 nums 执行排序即可。

代码

class Solution {
    public String minNumber(int[] nums) {
        String[] strs = new String[nums.length];
        for(int i = 0;i < nums.length;i++)
            strs[i] = String.valueOf(nums[i]);
        fastSort(strs, 0, strs.length - 1);
        StringBuilder res = new StringBuilder();
        for(String s : strs)
            res.append(s);
        return res.toString();
    }
    // 快速排序
    public void fastSort(String[] strs, int l, int r) {
        if(l >= r) return;
        int i = l, j = r;
        String tmp = strs[i];
        while(i < j) {
            while((strs[j] + strs[l]).compareTo(strs[l] + strs[j]) >= 0 && i < j) j--;
            while((strs[i] + strs[l]).compareTo(strs[l] + strs[i]) <= 0 && i < j) i++;
            tmp = strs[i];
            strs[i] = strs[j];
            strs[j] = tmp;
        }
        strs[i] = strs[l];
        strs[l] = tmp;
        fastSort(strs, l, i - 1);
        fastSort(strs, i + 1, r);
    }
}

l, i - 1);
fastSort(strs, i + 1, r);
}
}


全部评论

相关推荐

野猪不是猪🐗:是我导致的,我前天对力扣进行了跨站脚本攻击,网站把我的请求给block了(胡言乱语)
点赞 评论 收藏
分享
2024-12-27 13:08
华南理工大学 Java
蝴蝶飞出了潜水钟丿:多看一眼就会💥
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务