算法练习 剑指offer 45.把数组排成最小的数

难度:中等

题目:

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

示例 1:

输入: [10,2]

输出: "102"

示例 2:

输入: [3,30,34,5,9]

输出: "3033459"

提示:

0 < nums.length <= 100

说明:

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

拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0

来源:力扣(LeetCode)


解答:

 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();

    }

    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);

       }

更改了快速排序的方法,改变了排序规则,比较了两个字符串拼接之后的大小,然后更改字符串组,来完成题目要求的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。