本题为剑指offer面试题33
牛客网测试地址:https://www.nowcoder.com/questionTerminal/8fecd3f8ba334add803bf2a06af1b993
- 时间限制:1秒 空间限制:32768K
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
package go.jacob.day508;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Demo1 {
public String PrintMinNumber(int[] numbers) {
// 考虑无效输入
if (numbers == null||numbers.length==0)
return null;
int N = numbers.length;
ArrayList<String> list = new ArrayList<String>();
for (int i = 0; i < N; i++) {
list.add(String.valueOf(numbers[i]));
}
// 自定义比较器:默认比较器是比较每一个元素,不能满足要求
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
String s1 = (String) o1;
String s2 = (String) o2;
return (s1 + s2).compareTo(s2 + s1);
}
});
// 用StringBuilder效率比StringBuffer和String高
StringBuilder s = new StringBuilder();
for (String str : list) {
s = s.append(str);
}
return s.toString();
}
}