最大数 快排+数学计算

题目:

  

 思路:

  1 快速排序思想,倒序排列 + 数学公式  

      int x = 12; int y = 345 x 拼接 y = 12345 = 12 * 1000 + 345 = x * 1000 + y;

      y 拼接 x = 34512 = 345 * 100 + 12 = y * 100 + x;

      上面的1000是哪里来的?因为y是3位数。

      上面的100是哪里来的?因为x是2位数;

  2 遍历nums 用StringBuilder进行拼接,返回结果

 


(一) 代码

class Solution {
    public String largestNumber(int[] nums) {

        //快速排序 排序结果为倒叙,用Stringbuilder进行拼接
        quickSort(nums,0,nums.length-1);
        //如果倒排结果第一个为0 返回0
        if(nums[0] == 0){
            return "0";
        }
        //拼接结果
        StringBuilder sb = new StringBuilder();
        for(int num : nums){
            sb.append(num);
        }
        return sb.toString();
    }

    private void quickSort(int[] nums,int start,int end){

        if(start >= end){
            return;
        }
        //基准数
        int privot = nums[start];
        //基准下标
        int index = start;

        for(int i = start+1 ; i <= end ; i++){
            //进位
            long x = 10;  //注意这里一定是long 类型
            long y = 10;  //注意这里一定是long 类型
            //基准的进位
            while(privot >= x){
                x *= 10;
            }
            //数组i 位置数据的进位
            while(nums[i] >= y){
                y *= 10;
            }
            //数学计算比较
            if(nums[i] * x + privot > privot * y + nums[i]){
                index += 1;
                swap(nums,index,i);
            }
        }
        //将基准数交换到相应的位置
        swap(nums,index,start);
        //递归
        quickSort(nums,start,index-1);
        quickSort(nums,index+1,end);
    }

    private void swap(int[] nums,int i,int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

 


 

 

 

      无力反抗,就顺应

 

posted @ 2021-10-17 23:30  朝才  阅读(50)  评论(0编辑  收藏  举报