题目链接
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
示例
输入:[3,32,321]输出:"321323"
解题思路
可以看成是一个排序问题,在比较两个 字符串 S1 和 S2 的大小时,应该比较的是 S1+S2 和 S2+S1 的大小,如果 S1+S2 < S2+S1 ,那么应该把 S1 排在前面,否则应该把 S2 排在前面。
要准确看到最后输出的是 「字符串」 ,所以要想到将原int数组,变为字符串数组,然后通过字符串相加,得到的新字符串去比较大小,得到最终结果
注意:
- 最后输出是字符串格式
- 通过S1+S2 和 S2+S1去进行排序
精华:
- 看到最后输出的是字符串
- 将int数组变为字符串数组
- 因为是字符串,所以比较s1+s2和s2+s1的大小
- 排序
- 字符串连接
- 输出
代码
public String PrintMinNumber(int[] numbers) {if (numbers == null || numbers.length == 0){return "";}int n = numbers.length;String[] nums = new String[n];for (int i = 0; i < n; i++) {nums[i] = numbers[i] + "";}Arrays.sort(nums, (s1, s2) -> (s1 + s2).compareTo(s2 + s1));String ret = "";for (String str : nums) {ret += str;}// StringJoiner joiner = new StringJoiner("");// 数组不能使用lambda表达式// nums.forEach(joiner::add);// 若想使用,可以将数组转换为list// Arrays.asList(nums).forEach(joiner::add);return ret;}
public String PrintMinNumber(int[] numbers) {List<String> nums = new ArrayList<>();for (int number : numbers) {nums.add(String.valueOf(number));}nums.sort(Comparator.comparing(s -> s, (o1, o2) -> (o1 + o2).compareTo(o2 + o1)));StringJoiner joiner = new StringJoiner("");nums.forEach(joiner::add);return joiner.toString();}
代码分析
- java8 lambda表达式(这块内容写完后,再补连接)
- 只有函数式接口才可以用java8 特性 lambda 表达式
被@FunctionalInterfacepublic interface Comparator<T> {......}
@FunctionalInterface修饰的接口,叫做函数式接口
Arrays不能使用 lambda表达式 输出
要使用lambda表达式,需要将数组变为ArrayListArrays.asList(array).forEach(System.out::println);
Arrays.asList(array).forEach(joiner::add);
String.valueOf()将括号内的数据转换成String类型
- 不能定义成
StringBuilder,StringBuilder是一个可变字符串不是字符串数组。
把握住核心
- 将int数组转换为字符数组
- 字符数组之间进行相加排序。
s1+s2与s2+s1
