解题思路:
这道题目的常规求解思路是先求出这个数组中所有数字的全排列,然后把每个排列拼起来,最后求出
拼起来的数字的最小值。但是这样做,时间复杂度为n!, 过于高。
其实,这道题是希望我们能够找到一个排序规则,数组根据这个规则排序之后能排成一个最小的数字。
要确定排序规则,就要比较两个数字,也就是给出两个数字m和n,我们需要确定一个规则判断m和n,哪个
应该排在前面,而不是仅仅比较这两个数字的值哪个更大。接下来考虑怎么去拼接数字,即给出数字m和n怎
么得到数字mn和nm并比较它们的大小。直接数值计算并不难,但需要考虑int类型的最大范围。一种非常直观
的解决大数问题的方法是把数字转换为字符串,然后按照字符串大小的比较规则进行比较即可。
public String PrintMinNumber(int[] numbers)
{
// 先对numbers的情况进行判断
if (numbers == null || numbers.length == 0)
return "";
List<Integer> list = new ArrayList<Integer>();
// 用list存放数组元素
for (int i: numbers)
{
list.add(i);
}
// 使用集合Collections进行排序
Collections.sort(list, new Comparator<Integer>()
{
@Override
public int compare(Integer o1, Integer o2)
{
// 自定义排序规则,o1o2>o2o1返回1, o1o2<o2o1,返回-1, 否则返回0
String str1 = o1 +"" + o2;
String str2 = o2 + "" + o1;
return str1.compareTo(str2); // 字符串比较
}
});
StringBuilder sBuilder = new StringBuilder();
for (Integer i: list)
{
sBuilder.append(i);
}
return sBuilder.toString();
}
或者是使用Arrays.sort()函数进行排序
public String printMinNumber(int[] numbers)
{
// 先对numbers的情况进行判断
if (numbers == null || numbers.length == 0)
return "";
// 创建一个String数组,存放每一个numbers元素
String[] str = new String[numbers.length];
// 初始化数组
for (int i=0; i<numbers.length; i++)
str[i] = String.valueOf(numbers[i]);
// 利用Arrays.sort()进行排序
Arrays.sort(str, new Comparator<String>()
{
@Override
public int compare(String s1, String s2)
{
String c1 = s1 + s2;
String c2 = s2 + s1;
return c1.compareTo(c2);
}
});
StringBuffer sBuilder = new StringBuffer();
for (int i=0; i<numbers.length; i++)
{
sBuilder.append(str[i]);
}
return sBuilder.toString();
}