题目描述:
输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组[3,32,321],则打印出这三个数字能排成的最小数字为321323。
1、输出结果可能非常大,所以你需要返回一个字符串而不是整数
2、拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0数据范围:0<=len(numbers)<=100
示例1
输入:[11,3]
返回值:"113"
示例2
输入:[]
返回值:""
示例3
输入:[3,32,321]
返回值:"321323"
解法一:重载排序
思路:
处理过程如下:
- 处理空数组的特殊情况。
- 将数组中的数字元素转换成字符串类型。
- 重载排序方法,然后比较x+y和y+x的大小,进行排序。
- 将排序结果再按照字符串拼接成一个整体。
代码:
import java.util.*;
public class Solution {
public String PrintMinNumber(int [] numbers) {
//处理特殊情况
if(numbers == null || numbers.length == 0){
return "";
}
//将数字转为字符串
String[] nums = new String[numbers.length];
for(int i=0; i<numbers.length; i++){
nums[i] = numbers[i]+"";
}
//自定义排序规则
Arrays.sort(nums, new Comparator<String>(){
public int compare(String s1, String s2){
return (s1+s2).compareTo(s2+s1);
}
});
//将排序好的字符串组成最终结果
StringBuilder sb = new StringBuilder();
for(int i=0; i<nums.length; i++){
sb.append(nums[i]);
}
return sb.toString();
}
}
解法二:冒泡排序
思路:
思路与解法一相同,不同在于将上面的Arrays.sort()方法换成了冒泡排序。
代码:
import java.util.*;
public class Solution {
public String PrintMinNumber(int [] numbers) {
//空数组的情况
if(numbers == null || numbers.length == 0)
return "";
String[] nums = new String[numbers.length];
//将数字转成字符
for(int i = 0; i < numbers.length; i++)
nums[i] = numbers[i] + "";
//冒泡排序
for(int i = 0; i < nums.length - 1; i++){
for(int j = 0; j < nums.length - i - 1; j++){
String s1 = nums[j] + nums[j + 1];
String s2 = nums[j + 1] + nums[j];
//比较拼接的大小交换位置
if(s1.compareTo(s2) > 0){
String temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
StringBuilder res = new StringBuilder();
//字符串叠加
for(int i = 0; i < nums.length; i++)
res.append(nums[i]);
return res.toString();
}
}