leetcode链接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入:[10,2]
输出: "102"
示例 2:
输入:[3,30,34,5,9]
输出: "3033459"
解题思路: 其实本质上是一个排序的问题,可以使用内置的排序也可以自定义一个快速排序来实现,排序规则是两个数x,y,x+y<y+x。
class Solution {
public String minNumber(int[] nums) {
String[] str = new String[nums.length];
for(int i=0;i<nums.length;i++){
str[i] = String.valueOf(nums[i]);
}
Arrays.sort(str, (x, y) -> (x + y).compareTo(y + x));
//order(str,0,str.length-1);
StringBuilder result = new StringBuilder();
for(String s:str){
result.append(s);
}
return result.toString();
}
public void order(String[] str,int start,int end){
if(start>=end) return;
int i = start;
int j = end;
String tmp = str[i];
while(i<j){
while((str[j]+str[start]).compareTo(str[start]+str[j])>=0 && i<j){
j--;
}
while((str[i]+str[start]).compareTo(str[start]+str[i])<=0 && i<j){
i++;
}
tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
str[i] = str[start];
str[start] = tmp;
order(str,start,i-1);
order(str,i+1,end);
}
}