class Solution {
public String minNumber(int[] nums) {
//思路:比较这些数的最高位、第二位 从小到大排应该 第一位一样的比较第二位,前面都一样,位数少的优先。
//24,103,9,20,2,29,12,210
//30 3035
if(nums==null||nums.length==0){
return "";
}
int len = nums.length;
int[] array= mySort(nums,0,len-1);
StringBuilder str = new StringBuilder();
for(int i =0 ; i<len;i++){
str.append(""+array[i]);
}
String string= str.toString();
return string;
}
public int[] mySort(int[] nums,int left,int right){
int ll=left;
int rr=right;
int temp=nums[left];
while(rr>ll){
while(rr>ll && sort(temp,nums[rr])){
rr--;
}
nums[ll]=nums[rr];
while(rr>ll && sort(nums[ll],temp)){
ll++;
}
nums[rr]=nums[ll];
}
nums[rr]=temp;
if(rr>left+1){
mySort(nums,left,rr);
}
if(rr+1<right){
mySort(nums,rr+1,right);
}
return nums;
}
//x比y优先 那么返回true;
public boolean sort(int x,int y ){
String xx = String.valueOf(x);
String yy = String.valueOf(y);
//30 3035
//9999999999 溢出 使用String.compareTo 挨个比较字符
//此处要小于等于 快速排序要left小于等于temp就++;否则如果是小于 会一直循环 left不会动。
return (xx+yy).compareTo(yy+xx)<=0;
}
}
排序,按照它说的规则 把数组中的元素排序。
最初想的太复杂了 在sort方法里做了很多判断。最后看题解发现可以直接把xx+yy 与 yy+xx作比较就行了。就知道谁应该排到前面了。使用快速排序的模板进行排序。快速排序有一个地方失误了,
while循环里与temp判断大小时一定要是小于等于 大于等于。否则遇到相等的就会一直陷入循环。last,first不会动了。
2,1, 2,1, 2