0
点赞
收藏
分享

微信扫一扫

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

Jonescy 2022-03-25 阅读 32
java
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 条评论