输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: “102”
示例 2:
输入: [3,30,34,5,9]
输出: “3033459”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof
可以看成基于字符串的字典序的排序,使用快排解决。java提供了compareTo方法来比较
判断规则
排序判断规则 为:
若拼接字符串 若str1+str2<str2+str1,则str1"小于"str2
若str1+str2>str2+str1,则str1"大于"str2(这里的小于是指str1在str2前面,大于是指后面) 具体可以去官方题解看,
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]);
}
//对字符串数组排序
quickSort(str,0,str.length-1);
StringBuffer result=new StringBuffer();
for(int i=0;i<str.length;i++){
result.append(str[i]);
}
return result.toString();
}
//快排
void quickSort(String[] str,int lowIndex,int highIndex){
int size=0;
size=highIndex-lowIndex+1;
if(size<=1){
return;
}
int keyIndex=partition(str,lowIndex,highIndex);
quickSort(str,lowIndex,keyIndex-1);
quickSort(str,keyIndex+1,highIndex);
}
//partion方法,返回基准值下标
int partition(String[] str,int lowIndex,int highIndex){
int left=lowIndex;
int right=highIndex;
//选择最左边的为基准值
String key=str[lowIndex];
while(left<right){
//right比基准值”大“,继续遍历,遇到”小的“停下
while(left<right&&(str[right]+key).compareTo(key+str[right])>=0){
right--;
}
//把这个”小于“基准值的字符给left
str[left]=str[right];
//left比基准值”小",继续遍历,遇到“大"的停下
while(left<right&&(str[left]+key).compareTo(key+str[left])<=0){
left++;
}
//把这个”大于“基准值的字符给right
str[right]=str[left];
}
//left和right相遇,赋值基准值
str[left]=key;
return left;
}
}