题目
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
解题思路
这题看似很简单其实难得的看不懂, 也是在大佬们的解题下才会做的, 首先先说结论, 我们比较两个字符串的时候 x + y > y + x的时候可以得知 x > y, x + y < y + x的时候可以得知 x < y, 然后当更多的数字进来比较后可归纳得出的结论是 x < y, y < z , z< a=> x < y < z,并且最后x+y+z得出的结论就是最小值, 证明过程可看B站大佬的解说BV1uV411i7uh这个视频,解说的很详细, 然后按照上述结论我们可以使用快速排序去对此题进行解答, 代码如下。
Java代码实现
public class MinNumber {
public String minNumber(int[] nums) {
String[] tmp = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
tmp[i] = String.valueOf(nums[i]);
}
quickSort(tmp, 0 , tmp.length - 1);
StringBuilder res = new StringBuilder();
for(String s : tmp)
res.append(s);
return res.toString();
}
public void quickSort(String[] arrays, int leftIndex, int rightIndex){
if(leftIndex > rightIndex ){
return;
}
int l = leftIndex;
int r = rightIndex;
while(l < r){
while((arrays[r] + arrays[leftIndex]).compareTo(arrays[leftIndex] + arrays[r]) >= 0 && l < r){
r --;
}
while((arrays[l] + arrays[leftIndex]).compareTo(arrays[leftIndex] + arrays[l]) <= 0 && l < r){
l ++;
}
swap(arrays, l , r);
}
swap(arrays, l, leftIndex);
quickSort(arrays, leftIndex, l - 1);
quickSort(arrays,l + 1 , rightIndex);
}
private void swap(String[] res, int i, int j) {
String tmp = res[j];
res[j] = res[i];
res[i] = tmp;
}
}