题目
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路
可以看成是一个排序问题,先将整型数组转换成String数组,在比较两个字符串 s1 和 s2 的大小时,应该比较的是 s1+s2 和 s2+s1 的大小,如果s1+s2 < s2+s1,那么应该把 s1 排在右边,否则应该把 s2 排在右边。
package com.zhumq.leetcode;
import java.util.Arrays;
import java.util.Comparator;
import org.junit.Test;
public class LargestNumber {
public int largestnumber(int arr[]) {
//先将整个字符串扎转换成字符串数组
String[] str = new String[arr.length];
for(int i = 0;i<arr.length;i++) {
str[i] = String.valueOf(arr[i]);
}
/*
* 自定义比较器比较,把s1和s2拼接成的s1s2和s2s1按照‘字符串大小的比较规则’来处理即可。
*/
Arrays.sort(str, new Comparator<String>(){
public int compare(String s1,String s2) {
String leftRight = s1 + s2;
String rightLeft = s2 + s1;
/*
* 如果s1s2>s2s1,打印s1s2,即s2排在s1右边,则对应数组中应该认为s1<s2;
* compare根据比较结果正负判断大小,结果为正s1>s2即s1应该在右边,结果为负s2>s1即s2应该在右边;
* 所以这里加上'-'号就是求组合后最大的数了!!!
*/
return leftRight.compareTo(rightLeft);
}
});
//拼接字符串数组
StringBuilder sb = new StringBuilder();
for(final String s : str) {
sb.append(s);
}
///防止输入[0,0]时sb="00"等情况
if(sb.charAt(0)=='0'&&sb.length()>1) {
sb.deleteCharAt(0);
}
return Integer.parseInt(sb.toString());
}
//测试
@Test
public void test1() {
int arr[] = {3,301,312};
System.out.println(largestnumber(arr));
}
}