[编程题]把数组排成最小的数
把数组排成最小的数
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;
}
}
查看19道真题和解析