一、需求
- 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: "102"
示例 2:
输入: [3,30,34,5,9]
输出: "3033459"
二、自定义排序
2.1 思路分析
- 首先容易想到的是求这个数组的全排列,每一种排列都要转换成字符串,然后就是比较所有的字符串,返回最小的那个,其中还得考虑含有重复元素的情况,比较繁琐;
- 本题采用了一种新颖的思路,即自定义排序,这个自定义的排序规则目前看似简单,但我目前还理解不了;
2.2 代码实现
class Solution {
public String minNumber(int[] nums) {
String[] str = new String[nums.length];
//1.将int型数组转成字符串数组
for(int i = 0; i < nums.length; i++) {
//将整数转成字符串
str[i] = String.valueOf(nums[i]);
}
//2.开始自定义排序
Arrays.sort(str,new Comparator<String>() {
public int compare(String o1,String o2) {
return (o1+o2).compareTo(o2+o1);
}
});
//3.打印结果
String res = "";
for(String s : str) {
res += s;
}
return res;
}
}
2.3 复杂度分析
- 时间复杂度为
,其中N为返回值的字符数量,使用快排或内置函数的平均时间复杂度为
;
- 空间复杂度为
,字符串str占用了线性大小的额外空间;
三、学习地址
作者:子烁爱学习
链接:https://www.bilibili.com/video/BV1u7411t7yH?from=search&seid=2709112250469682690