题目描述
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: "102"
示例 2:
输入: [3,30,34,5,9]
输出: "3033459"
分析
其实这是一个排列问题,相当于把数组中的元素按升序排序,只不过元素之间的比较规则不同,下面讲解一下该如何比较不同元素:
设有字符串 x 和 y,
如果拼接字符串 x+y > y + x ,则 x > y
如果拼接字符串 x+y < y + x ,则 x < y
这里的x < y不是大小上的,而是排完序后x在y的左边。如3,和32比较,332 > 323,所以3 > 32
代码使用快速排序:
class Solution {
public String minNumber(int[] nums) {
String[] strs = new String[nums.length];
for(int i = 0; i < nums.length; i++) {
strs[i] = String.valueOf(nums[i]);
}
quickSortStr(strs,0,strs.length-1);
StringBuffer buffer = new StringBuffer();
for(String s : strs) {
buffer.append(s);
}
return buffer.toString();
}
public void quickSortStr(String[] strs,int begin,int end) {
if(begin >= end) {
return;
}
int left = begin;
int right = end;
String povit = strs[begin];
while (begin < end) {
//找到比povit大的值
if((strs[begin]+povit).compareTo(povit+strs[begin]) < 0) {
begin++;
continue;
}
//找到比povit小的值
if((strs[end]+povit).compareTo(povit+strs[end]) > 0) {
end--;
continue;
}
//交换两者的值
String temp = strs[begin];
strs[begin] = strs[end];
strs[end] = temp;
if(strs[begin].equals(povit) == true) {
end = end - 1;
} else {
begin = begin + 1;
}
}
quickSortStr(strs,left,begin-1);
quickSortStr(strs,begin+1,right);
}
}
如果对排序算法不是很清楚,可以看一下这篇博客九大排序算法
时间复杂度为o(nlogn),空间复杂度为o(n)。