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

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

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

示例 1:

输入: [10,2]
输出: “102”
示例 2:

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

提示:

0 < nums.length <= 100
说明:

输出结果可能非常大,所以你需要返回一个字符串而不是整数
拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0

核心:快速排序改变排序规则,判断b在数字中在高位时的大小,当a为轴’ba’<'ab’时b往前排,‘ba’>'ab’时b往后排。
因为是判断b在数字中在高位时的大小,如果b在高位时比a在高位时小,那么b应该往前排。比如
a为3,b为30
b在高位时ba为303,a在高位时ab为330,303<330,因此b应该往前排,因为b在高位时较小

其它代码参照快排,相当于快排改变排序规则

class Solution {
    int[] nums;
    public String minNumber(int[] nums) {
        this.nums=nums;
        sort(0,nums.length-1);
        StringBuilder stringBuilder = new StringBuilder();
        for (int num : nums) {
            stringBuilder.append(num);
        }
        return stringBuilder.toString();
    }
    public void sort(int i,int j){
        if (i>=j){
            return;
        }
        int x=i,y=j;
        while (i<j){
        	//这里需要用String类的compareTo方法,因为转为Integer比较会溢出
        	//以x最左元素为轴,当j为高位时,jx>=xj,因此j往后排,j--
            while (i<j&&(Integer.toString(nums[x])+ nums[j]).compareTo(Integer.toString(nums[j])+ nums[x])<=0){
                j--;
            }
            //当i为高位时,ix<=xi,因此i往前排,i++
            while (i<j&&(Integer.toString(nums[x])+ nums[i]).compareTo(Integer.toString(nums[i])+ nums[x])>=0){
                i++;
            }
            swap(i,j);
        }
        swap(x,i);
        sort(x,i-1);
        sort(i+1,y);
    }
    public void swap(int i,int j){
        int tmp=nums[i];
        nums[i]=nums[j];
        nums[j]=tmp;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值