32. 把数组排成最小的数
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
解题思路
对各元素排序后连接输出。
可以采用选择冒泡快排等各种排序方式。
排序条件为:两个数从高位开始逐位比较,较小的数排在前面,考虑两个数位数不同的情况,考虑
代码实现
public class Solution {
public String PrintMinNumber(int [] numbers) {
if (numbers == null) {
return "";
}
String res = "";
int min = 0;
// 选择排序
for (int i = 0; i < numbers.length; i++) {
for (int j = i; j < numbers.length; j++) {
if (compareFromHigh(numbers[j],numbers[min]) > 0) {
min = j;
}
}
res = res.concat(numbers[min]);
numbers[min] = numbers[i];
min = i+1;
}
return res;
}
public int compareFromHigh(int num1,int num2){
char[] ch1 = String.valueOf(num1).toCharArray();
char[] ch2 = String.valueOf(num2).toCharArray();
for (int i = 0; i < ch1.length && i < ch2.length; i++) {
if (ch1[i] > ch2[i]) {
return -1;
}
else if (ch1[i] < ch2[i]) {
return 1;
}
}
if (ch1.length > ch2.length) {
int i = ch2.length
for (; i< ch1.length && ch1[0] == ch1[i]; i++);
if (i >= ch1.length){
return 0;
}
return ch1[0] < ch1[i]? -1:1;
}
else if(ch1.length < ch2.length) {
int i = ch1.length
for (; i< ch2.length && ch2[0] == ch2[i]; i++);
if (i >= ch2.length){
return 0;
}
return ch2[0] < ch2[ch1.length]? 1:-1;
}
else{
return 0;
}
}
}