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

class Solution {
    public String minNumber(int[] nums) {
        //思路:比较这些数的最高位、第二位  从小到大排应该 第一位一样的比较第二位,前面都一样,位数少的优先。
        //24,103,9,20,2,29,12,210
        //30 3035
        if(nums==null||nums.length==0){
            return "";
        }
        int len = nums.length;
       int[] array= mySort(nums,0,len-1);
       StringBuilder str = new StringBuilder();
        for(int i =0 ; i<len;i++){
            str.append(""+array[i]);
        }
       String string= str.toString();
       return string;
    }

    public int[] mySort(int[] nums,int left,int right){
        int ll=left;
        int rr=right;
        int temp=nums[left];
        while(rr>ll){
            while(rr>ll && sort(temp,nums[rr])){
                rr--;
            }
            nums[ll]=nums[rr];
            while(rr>ll && sort(nums[ll],temp)){
                ll++;
            }
             nums[rr]=nums[ll];
        }
        nums[rr]=temp;
        if(rr>left+1){
            mySort(nums,left,rr);
        }
        if(rr+1<right){
            mySort(nums,rr+1,right);
        }
        return nums;
    }

    //x比y优先 那么返回true;
    public boolean sort(int x,int y ){
      String xx = String.valueOf(x);
      String yy = String.valueOf(y);
      //30  3035
      //9999999999 溢出 使用String.compareTo 挨个比较字符
      //此处要小于等于 快速排序要left小于等于temp就++;否则如果是小于 会一直循环 left不会动。
    return (xx+yy).compareTo(yy+xx)<=0;
    }
}

排序,按照它说的规则 把数组中的元素排序。

最初想的太复杂了  在sort方法里做了很多判断。最后看题解发现可以直接把xx+yy 与 yy+xx作比较就行了。就知道谁应该排到前面了。使用快速排序的模板进行排序。快速排序有一个地方失误了,

 while循环里与temp判断大小时一定要是小于等于 大于等于。否则遇到相等的就会一直陷入循环。last,first不会动了。

2,1, 2,1, 2  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值