7.23 第一次写,无法 AC
7.24 出了点小错误,但大致上还是可以 A 的
题目描述
原题链接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/
解题思路
K 神题解:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/solution/
7.24 做题感悟:
核心:改变排序的规则(String 重写过 compareTo 方法,所以直接用就行):

```java
class Solution {
public String minNumber(int[] nums) {String[] strs = new String[nums.length];for(int i = 0; i < nums.length; i++)strs[i] = String.valueOf(nums[i]);quickSort(strs, 0, strs.length - 1);StringBuilder res = new StringBuilder();for(String s : strs)res.append(s);return res.toString();
} public void quickSort(String[] nums, int l, int h) {
if(l >= h) return; // 切到只剩一个数就不用再切了!已经全部快排完毕了! int mid = partition(nums, l, h); // 依据切分获得切开左右俩区间的中间索引 quickSort(nums, l, mid - 1); quickSort(nums, mid + 1, h);}
// 切分获取切开原数组左右俩区间的中间索引 // 同时确定切分元素在原数组中的位置 public int partition(String[] nums, int l, int h) {
// 取最左边的元素为切分元素,本身是没毛病的; // 但是当数据全为逆序时,其排序的时间复杂读和冒泡排序差不多; // 所以我们改进一下,选用中间的元素来当切分元素。 String cut = nums[l]; // 切分的原理还是以最左边的元素为切分元素; // 只是把中间的元素换和最左边的元素交换位置; // 这样选择的切分元素在逆序数组的情况下时间复杂度就不会太大了! //swap(nums, l, (l + h) / 2); //String cut = nums[l]; int i = l, j = h; while(i < j) { while(i < j && (nums[j] + cut).compareTo(cut + nums[j]) >= 0) j--; while(i < j && (nums[i] + cut).compareTo(cut + nums[i]) <= 0) i++; if(i < j) swap(nums, i, j); } // 将切分元素 nums[l] 换到属于它的位置,并返回其索引 j swap(nums, l, j); return j;}
public void swap(String[] nums, int i, int j) {
String tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp;}
} ```
