输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: "102"
示例 2:
输入: [3,30,34,5,9]
输出: "3033459"
提示:
0 < nums.length <= 100
说明:
输出结果可能非常大,所以你需要返回一个字符串而不是整数
拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
解题思路:对数组进行从小到大排序,大小的依据是转化为字符串后,a+b与b+a的比较大小,使用快速排序对数组排序,唯一区别是判断两数大小,另写一个函数,最后将排序的数组元素转化为字符串并连接。
class Solution {
public String minNumber(int[] nums) {
quickSort(nums, 0, nums.length - 1);
String ret = new String();
for(int i: nums){
ret += String.valueOf(i);
}
return ret;
}
public void quickSort(int[] n, int low, int high){
if(low < high){
int pivot = partition(n, low, high);
quickSort(n, low, pivot - 1);
quickSort(n, pivot + 1, high);
}
}
public int partition(int[] n, int low, int high){
while(low < high){
while(low < high && greater(n[high], n[low]))
high--;
swap(n, low, high);
while(low < high && greater(n[high], n[low]))
low++;
swap(n, low, high);
}
return low;
}
public boolean greater(int a, int b){ //a>b 返回true
return (String.valueOf(a) + String.valueOf(b)).compareTo(String.valueOf(b) + String.valueOf(a)) >= 0? true: false;
}
public void swap(int[] n, int p, int q){
if(p != q){
n[p] = n[p] ^ n[q];
n[q] = n[p] ^ n[q];
n[p] = n[p] ^ n[q];
}
}
}