/**
* 面试题45:把数组排成最小的数
* 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
* 例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
* @author
* @create 2021-04-07 11:13
*/
public class Solution45 {
public static void main(String[] args) {
int[] numbers = {3,5,1,4,2};
String res = printMinNumber(numbers);
System.out.println(res);
}
public static String printMinNumber(int [] numbers) {
if (numbers == null || numbers.length == 0){
return "";
}
for (int i = 0; i < numbers.length; i++) {
for (int j = i+1; j < numbers.length; j++) {
//两个int型相加可能会超过范围,因此用字符串来表示数字
String ab = numbers[i] + String.valueOf(numbers[j]);
String ba = numbers[j] + String.valueOf(numbers[i]);
//ab大于ba就交换两者的位置,类似于冒泡排序,每一轮将最小的放在前面
if (ab.compareTo(ba)>0){
int temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
}
}
}
StringBuilder str = new StringBuilder();
for (int number : numbers) {
str.append(number);
}
return str.toString();
}
}
String类中的compareto()如下:
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}