[编程题]把数组排成最小的数
把数组排成最小的数
http://www.nowcoder.com/questionTerminal/8fecd3f8ba334add803bf2a06af1b993
先说一下运行时间12m 速度来说还是可以的,思路简单,就是写的有点长。更改快排的判断条件就可以了
再说一下方法,简单而言,这就是一个排序,不过判断条件不一样而已,以快速排序为例,设置原有的判断条件改为两个整数连接起来谁比较大。所以这里用了一个笨方法来比较:
public boolean Comp(int a,int b){ String s1=String.valueOf(a); String s2=String.valueOf(b); String str1=s1.concat(s2); String str2=s2.concat(s1); // if(Integer.parseInt(s1.concat(s2))<=Integer.parseInt(s2.concat(s1))) // return true; for(int i=0;i<str1.length()-1;i++){ if(str1.charAt(i)==str2.charAt(i)){ continue; }else if(str1.charAt(i)<str2.charAt(i)){ return true; }else{ return false; } } return true; }
这里判断是不是前一个数字在前面组成的数字比较小,如果ab<ba就返回true。
顺便提一下,这里的比较本来想用字符串连接后转Int比较的,但是调试的时候越界了,所以就改成了一个一个字符来比较大小。所以后面的快速排序的方法就照搬就可以了。
import java.util.ArrayList; import java.util.Stack; public class Solution { public String PrintMinNumber(int [] numbers){ if(numbers.length==0) return ""; if(numbers.length==1) return String.valueOf(numbers[0]); QuickSort(numbers,0,numbers.length-1); String str=String.valueOf(numbers[0]); int start=0; int end=numbers.length-1; int index=Partition(numbers,start,end); for(int i=1;i<numbers.length;i++){ str=str.concat(String.valueOf(numbers[i])); } return str; } public void QuickSort(int[] arr,int left,int right){ if(left<right){ int index=Partition(arr,left,right); QuickSort(arr,left,index-1); QuickSort(arr,index+1,right); } } public int Partition(int[] arr,int l,int r){ int pivot=arr[l]; while(l<r){ while(l<r&&Comp(pivot,arr[r])) r--; if(l<r) arr[l++]=arr[r]; while(l<r&&Comp(arr[l],pivot)) l++; if(l<r) arr[r--]=arr[l]; } arr[l]=pivot; return l; } public boolean Comp(int a,int b){ String s1=String.valueOf(a); String s2=String.valueOf(b); String str1=s1.concat(s2); String str2=s2.concat(s1); // if(Integer.parseInt(s1.concat(s2))<=Integer.parseInt(s2.concat(s1))) // return true; //if(str1.equals(str2)) return true; for(int i=0;i<str1.length()-1;i++){ if(str1.charAt(i)==str2.charAt(i)){ continue; }else if(str1.charAt(i)<str2.charAt(i)){ return true; }else{ return false; } } return true; } }