题目
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: "102"
题解:
此题可以理解为排序的变体,只不过排序的规则需要变一下。
设数组 nums 中任意两数字的字符串为 x 和 y ,则规定排序判断规则为:
若拼接字符串 x+y > y+x ,则 x 大于 y ;
反之,若 x+y < y+x ,则 x 小于 y ;
例子:"3" "30"
330 > 303 则 3>30;
代码:
快排
class Solution {
public String minNumber(int[] nums) {
int n = nums.length;
String[] strs = new String[n];
for(int i=0;i<n;i++){
strs[i] = String.valueOf(nums[i]);
}
quickSort(strs,0,n-1);
StringBuilder res = new StringBuilder();
for(String s : strs)
res.append(s);
return res.toString();
}
public void(String[] strs,int l,int r){
if(l>=r) return;
int i=l,j=r;
String temp = strs[l];
while(i<j){
while(i<j && (strs[j]+temp).compareTo(temp+strs[j])>=0) j--;
if(i<j){
strs[i] = strs[j];
i++;
}
while(i<j && (strs[i]+temp).compareTo(temp+strs[i])< 0) i++;
if(i<j){
strs[j] = strs[i];
j--;
}
}
strs[i] = temp;
quickSort(strs,l,i-1);
quickSort(strs,i+1,r);
}
}