1、题目描述
输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组[3,32,321],则打印出这三个数字能排成的最小数字为321323。
1.输出结果可能非常大,所以你需要返回一个字符串而不是整数
2.拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
数据范围:
0<=len(numbers)<=100
2、算法分析
首先对整型数组中的元素转换成String字符串类型的数组元素。 然后对字符串数组中的元素进行两两拼接,然后排序比较。注意使用的是自定义排序。对字符串数组进行自定义排序后,然后对数组中的元素进行拼接。使用的是StringBuilder。
下面主要是比较这一块。使用的是
// 自定义排序数组中得元素。 Arrays.sort(str,new Comparator<String>(){ public int compare(String s1,String s2){ String c1 = s1 + s2; String c2 = s2 + s1; return c1.compareTo(c2); } }); 上面得相当于: for (int i=0;i<numbers.length;i++){ for (int j=i+1;j<numbers.length;j++){ Long a=Long.valueOf(numbers[i]+""+numbers[j]); Long b=Long.valueOf(numbers[j]+""+numbers[i]); if(a>b){ int temp=numbers[i]; numbers[i]=numbers[j]; numbers[j]=temp; } } }
先拼接数组中得元素,然后再近比较。
a.compareTo(b)。
public int compare(int a,int b)
a.compareTo(b):升序
b.compareTo(a):降序
返回值为1时,也就是说 a的值大于b的值
返回-1时,a值小于b得值
返回值0非常特殊。返回0,表示不交换顺序,但表示两个元素相同
3、代码实现
import java.util.*;
public class Solution {
public String PrintMinNumber(int [] numbers) {
if(numbers == null || numbers.length == 0){
return "";
}
int len = numbers.length;
String[] str = new String[len];
// 将整形数组得元素存储到字符串数组中
for(int i = 0;i < numbers.length;i++){
str[i] = String.valueOf(numbers[i]);
}
//对数组中得元素进行排序
Arrays.sort(str,new Comparator<String>(){
public int compare(String s1,String s2){
String c1 = s1 + s2;
String c2 = s2 + s1;
//
return c1.compareTo(c2);
}
});
// 最后返回得是拼接排序,然后再根据字符串进行拼接。
StringBuilder sb = new StringBuilder();
for(int i = 0;i < str.length;i++){
sb.append(str[i]);
}
return sb.toString();
}
}