剑指Offer32:把数组排成最小的数(Java)
当提交代码后报“请修改类名为Main” 建议重置,否则正确的代码也会报数组越界之类的错误。至于为什么会出现我是没搞懂,不过重置之后变成刚开始做题的样子就好了。
参考文献:
https://www.nowcoder.com/questionTerminal/8fecd3f8ba334add803bf2a06af1b993?f=discussion https://blog.csdn.net/fanzitao/article/details/7895344
https://www.cnblogs.com/learnapi/p/9003112.html
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
在看了牛客网上的解答后存在以下两种解体方式
方法一:转成整型的ArrayList,利用Collections.sort自定义比较方式进行排序。
Collections.sort有两种类型:
- 对于String或Integer这些已经实现Comparable接口的类来说,可以直接使用Collections.sort方法传入list参数来实现默认方式(正序)排序。
- 对于自定义类型,或者自定义排序方式,可以通过实现Comparable接口的compareTo方法来进行。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Solution {
public String PrintMinNumber(int [] numbers) {
StringBuilder s =new StringBuilder("");
ArrayList<Integer> inlist=new ArrayList<Integer>();
for (int i=0;i<numbers.length;i++){
inlist.add(numbers[i]);
}
Collections.sort(inlist,new Comparator<Integer>(){
public int compare(Integer s1,Integer s2){
String str1=s1+""+s2;
String str2=s2+""+s1;
return str1.compareTo(str2);
}
});
for(int i:inlist){
s.append(i);}
String a=s.toString();
return a;//return String a=s.toString();是错误的写法
}
}
方法二:比较整数的先后顺序,可以把两个整数a1,a2按照不同的顺序拼接起来,比较a1+a2,a2+a1两个整数哪个小,若a1+a2拼接成的整数小则把a1放到a2的前面。按照这个思路把整个数组排一遍序,整个数组拼接起来的整数将是最小的整数。
关键点:排序;比较两个整数拼接后的大小,然后返回值小的拼接顺序
import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
public static String PrintMinNumber(int [] numbers) {//调用方法,遍历排序后的数组拼接字符串返回结果。
quicksort(numbers,0,numbers.length-1);
int i=0;
String str="";
while(i<numbers.length)
str+=numbers[i++];
return str;
}
public static void quicksort(int []arr,int begin,int end){//快速排序
if(begin>=end)
return;//
int index=sort(arr,begin,end);
quicksort(arr,begin,index-1);
quicksort(arr,index+1,end);
}
public static int sort(int[]arr,int start,int end){//快速排序
int temp=arr[start];
int i=start;
int j=end;
while(i!=j){
while(i<j&&!judge(arr,j,temp))
j--;
while(i<j&&judge(arr,i,temp))
i++;
if(i<j){
int tem=arr[i];
arr[i]=arr[j];
arr[j]=tem;
}
}
arr[start]=arr[i];
arr[i]=temp;
return i;
}
public static boolean judge(int []arr,int i,int temp){//把两个整数按不同顺序拼接起来比较大小,采用拼接后整数更小的拼接顺序。
Long a=Long.valueOf(arr[i]+""+temp);
Long b=Long.valueOf(temp+""+arr[i]);//Integer的范围太小需要使用Long型
if(a<=b)return true;
else return false;
}
}