classSolution { public String largestNumber(int[] nums) { String[] arr = Arrays.stream(nums).mapToObj(String::valueOf).toArray(String[]::new); Arrays.sort(arr, (a, b) -> { return (b + a).compareTo(a + b); }); if (arr[0].equals("0")) return"0"; StringBuildersb=newStringBuilder(); for (String t : arr) { sb.append(t); } return sb.toString(); } }
有趣的来了,快排 + 数学
比如: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位数;明白这个思想就能写出代码了
classSolution { public String largestNumber(int[] nums) { quick_sort(nums, 0, nums.length - 1); StringBuildersb=newStringBuilder(); if (nums[0] == 0) { return"0"; } for (int t : nums) { sb.append(t); } return sb.toString(); }
privatevoidquick_sort(int[] nums, int low, int high) { if (high <= low) { return; } intpivot= nums[high]; inti= low; for (intj= low; j < high; j++) { longx=10, y = 10; while (nums[j] >= x) x *= 10; //计算nums[j]排后面时前面那个数需要乘的进位 while (pivot >= y) y *= 10; if (nums[j] * y + pivot > pivot * x + nums[j]) {//逆序,大的在前面 swap(nums, i, j); i ++; } } swap(nums, i, high); quick_sort(nums, low, i - 1); quick_sort(nums, i + 1, high); }
privatevoidswap(int[] nums, int i, int j) { inttemp= nums[i]; nums[i] = nums[j]; nums[j] = temp; } }