剑指offer最优解Java版-把数组排成最小的数
2019-06-30 本文已影响1人
全菜工程师小辉
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
解决方法
将数字按照字典序进行升序排列,然后输出即可
class Solution {
public static String PrintMinNumber(int[] numbers) {
int n;
StringBuilder s = new StringBuilder();
List<Integer> list = new ArrayList<>();
n = numbers.length;
for (int i = 0; i < n; i++) {
list.add(numbers[i]);
}
list.sort((str1, str2) -> {
String s1 = str1 + "" + str2;
String s2 = str2 + "" + str1;
return s1.compareTo(s2);
});
list.forEach(s::append);
return s.toString();
}
public static void main(String[] args) {
int[] numbers = {3,32,321};
System.out.println(PrintMinNumber(numbers));
}
}
另附字符串比较结果:
String s1 = "abc";
String s2 = "abcd";
String s3 = "abcdfg";
String s4 = "1bcdfg";
String s5 = "cdfg";
System.out.println( s1.compareTo(s2) ); // -1 (前面相等,s1长度小1)
System.out.println( s1.compareTo(s3) ); // -3 (前面相等,s1长度小3)
System.out.println( s1.compareTo(s4) ); // 48 ("a"的ASCII码是97,"1"的的ASCII码是49,所以返回48)
System.out.println( s1.compareTo(s5) ); // -2 ("a"的ASCII码是97,"c"的ASCII码是99,所以返回-2)
复杂度分析:
- 时间复杂度:O(n)。
- 空间复杂度:O(1)。