import com.google.common.base.Preconditions;
import org.apache.commons.lang3.StringUtils;
import java.util.Comparator;
/**
* 输入一个正整数数组,把数组里所有的数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
*/
public class GetMinNumberWithArray {
public static class Comparator4combineStr implements Comparator<String> {
/**
* 比较两个字符串拼接之后的大小。
*
* 说明:
* String combine1 = numStr1 + numStr2;
* String combine2 = numStr2 + numStr1;
* 由于combine1和combine2的长度相同,故我们可以使用String.compareTo()方法来比较它们的大小。
*
* @param numStr1
* @param numStr2
* @return
*/
@Override
public int compare(String numStr1, String numStr2) {
Preconditions.checkArgument(StringUtils.isNotEmpty(numStr1) && StringUtils.isNotEmpty(numStr2));
String combine1 = numStr1 + numStr2;
String combine2 = numStr2 + numStr1;
return combine1.compareTo(combine2);
}
}
/**
* 指定比较器的快速排序。
*
* @param array
* @param left
* @param right
* @param comparator 使用该比较器来比较元素间的大小
* @return
*/
public static String[] quickSort(String[] array, int left, int right, Comparator comparator) {
if (left < right) {
int pivotPosition = partition(array, left, right, comparator);
quickSort(array, left, pivotPosition - 1, comparator);
quickSort(array, pivotPosition + 1, right, comparator);
}
return array;
}
public static int partition(String[] array, int left, int right, Comparator comparator) {
String pivot = array[left]; // 选取数组的头元素作为基准元素
int pivotPosition = left; // 基准元素的索引
for (int i = pivotPosition + 1; i <= right; i++) { // i表示当前元素的索引
if (comparator.compare(array[i], pivot) < 0) {
pivotPosition++;
if (pivotPosition != i) {
swap(array, pivotPosition, i);
}
}
}
if (pivotPosition != left) {
array[left] = array[pivotPosition];
array[pivotPosition] = pivot;
}
return pivotPosition;
}
/**
* 数组中,交换两个元素的位置
*/
private static void swap(String[] array, int pivotPosition, int i) {
String temp = array[pivotPosition];
array[pivotPosition] = array[i];
array[i] = temp;
}
/**
* 输入一个正整数数组,把数组里所有的数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
*
* 说明:
* 由两个正整数拼接而得的正整数的范围可能超出了int的范围,故这里需要考虑到大数的问题,所以我们将int数组转换为字符串数组来处理。
*
*
* @param array
*/
public static void printMinNumber(int[] array) {
Preconditions.checkArgument(array != null && array.length > 0);
// 将int数组转换为String数组
String[] numStrArray = new String[array.length];
for (int i = 0; i < array.length; i++) {
numStrArray[i] = array[i] + "";
}
// 自定义比较器
Comparator4combineStr comparator = new Comparator4combineStr();
// 按照指定规则排序
quickSort(numStrArray, 0 ,numStrArray.length -1, comparator);
// 将排序后的数组拼接成一个数并打印出来
StringBuilder builder = new StringBuilder();
for (String numStr : numStrArray) {
builder.append(numStr);
}
System.out.println(builder);
}
public static void main(String[] args) {
int[] array = {3, 32, 321};
printMinNumber(array);
}
}