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