思路

  1. 很朴素的想法,最小的数字一定首位最小,所以会想到进行排序,但是跟一般的数字排序有些差别,这里的排序条件是根据字符串拼接后的数值比较得出的,如果pre1 + pre2 的字符串 > pre2 + pre1 ,说明pre1 和 pre2需要进行交换。
  2. 这个递推关系是有两个条件
  • 所有数的可能中,每个数位数相同
  • 首位越小则该数字越小
  • 高位数越小,则整个数越小
  1. 严格的数学证明暂时不写。基于上面的思路可以得出,数组中最小的数字存在这样一个特征,即首位的数应该是最小的,且pre1 + pre2 的字符串 < pre2 + pre1
class Solution {

    public String minNumber(int[] nums) {
        return sort(nums);
    }
    // 这里的排序方法有多种选择,当前解法使用冒泡
    String sort(int[] nums) {
        // 排序规则,根据第一位,第二位...排序,如果前一位相同,但是后面长短不一样,一位有一位无,例如3 和 31 比较第二位的时候变为 33比 31
        
        // 冒泡排序,更改比较规则
        for (int i = nums.length - 1; i >= 0 ; i --) {
            for (int j = 0; j < i; j ++) {
                // 是否调换
                boolean change = false;
                // 前一个元素
                String s = Integer.toString(nums[j]) + Integer.toString(nums[j+1]);
                // 后一个元素
                String x = Integer.toString(nums[j+1]) + Integer.toString(nums[j]);
                int len = s.length();
                int index = 0;
                // 比较pre1和pre2
                while (index < len){
                    if (s.charAt(index) != x.charAt(index)) {
                        change =s.charAt(index) > x.charAt(index) ? true : false;
                        break;
                    }
                    index ++ ;
                }
                if (change) {
                    int tmp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = tmp;
                }
            }
        }

        StringBuilder sb = new StringBuilder();
        for (int i : nums) {
            sb.append(Integer.toString(i));
        }
        return sb.toString();
    }
}

Q.E.D.


每一个平凡的日常都是连续的奇迹