1.题目描述
剑指 Offer 45. 把数组排成最小的数
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: "102"
示例 2:
输入: [3,30,34,5,9]
输出: "3033459"
2.解题思路与代码
2.1 解题思路
这道题其实非常简单,要让数组中的数字拼接起来的数字尽可能小,那么就要让前面位越小的排在与前面,这样保证位数越高的数字越小。那么我们就可以将数字转化成字符串来进行拼接,转换成字符串之后其实我们就是比较数字拼接起来之后的字典序是否最小。基于这样的思想,首先我们将数字数组转换成字符串列表,然后对字符串列表进行排序,排序规则比较两个字符串拼接后的字典序,最后将字符串列表拼接起来返回即可。以 3 和 30 为例,首先对两个数字进行拼接,拼接方式有两种,结果分别是 330 和 303
然后比较两个数的字典序,由于字典序是从左往右开始比较,正好满足题意,因此我们先比较两个数的第一位,第一位都是 3 于是往下一位比较,此时 0 的字典序小于 3 ,因此 303 比 330 更小,返回 303.
2.2 代码
class Solution {
public String minNumber(int[] nums) {
StringBuilder builder = new StringBuilder();
List<String> list = new ArrayList<>();
for (int num : nums) {
list.add(String.valueOf(num));
}
list.sort((o1, o2) -> {
String s1 = o1 + o2;
String s2 = o2 + o1;
return s1.compareTo(s2);
});
for (String s : list) {
builder.append(s);
}
return builder.toString();
}
}
2.3 测试结果
通过测试
3.总结
- 将数字数组转换成字符串列表进行处理
- 依次按照字典序对列表进行排序,最后返回列表拼接结果即可