最大数 快排+数学计算
题目:
思路:
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; } }
无力反抗,就顺应