JZ32 - 把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
解题思路:使用排序算法进行排序即可,主要是修改比较规则。我这里使用快排,将key放在原数字前面和放在后面,组成的新的数字进行比较,决定原数字放在key前还是key后。主要思想就是是否交换位置应该由要交换的两个数组合之后比较决定。例如45和345,34545<45345,所以交换位置。
/**
* @author 枫叶火火
*/
import java.util.Scanner;
public class Solution {
public String PrintMinNumber(int [] numbers) {
StringBuffer returnStr = new StringBuffer("");
//如果numbers不是空并且长度不是0
if(numbers != null && numbers.length != 0){
//进行快速排序
quickSort(numbers, 0, numbers.length-1);
//字符串拼接
for (int i = 0 ; i < numbers.length ; i++){
returnStr.append(numbers[i]);
}
}
return returnStr.toString();
}
//快速排序
public void quickSort(int[] numbers,int begin,int end){
if(begin>=end) return;
int key = numbers[begin];
int i=begin,j=end;
while(i<j){
//自定义比较规则
while(i<j&&(numbers[j]+""+key).compareTo(key+""+numbers[j])>0) j--;
while(i<j&&(numbers[i]+""+key).compareTo(key+""+numbers[i])<=0) i++;
if(i<j){
int temp=numbers[i];
numbers[i]=numbers[j];
numbers[j]=temp;
}
}
numbers[begin]=numbers[i];
numbers[i]=key;
quickSort(numbers,begin,i-1);
quickSort(numbers,i+1,end);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
for(int i = 0 ; i < n ; i++){
arr[i] = scanner.nextInt();
}
Solution solution = new Solution();
String s = solution.PrintMinNumber(arr);
System.out.println(s);
}
}