版权声明
1. 剑指 Offer 45
1.1 复杂度分析
- 自定义比较器排序:
- 时间复杂度:
O(logn);
- 空间复杂度:
O(n);
1.2 自定义比较器排序
1.2.1 解题思路
- 解题思路:
- 本题的实质是一个排序问题,需要根据特定的规则,将数组中的数值排序,使得数组中的数排列为最小的数;
- 比较规则如下:E.g. {3, 23};
- 将所有整型转换为字符串;
- 按字典序为字符串排序,即可排列得到最小的数;
1.2.2 用函数实现比较器
- 用函数实现自定义比较器:被排序的数组必须为引用数据类型,不能为基本数据类型;
class Solution {
public String minNumber(int[] nums) {
if (nums == null || nums.length == 0)
throw new RuntimeException("Invalid input!");
String[] strs = new String[nums.length];
for (int i = 0; i < nums.length; i++)
strs[i] = String.valueOf(nums[i]);
Arrays.sort(strs, new Comparator<>() {
@Override
public int compare(String str1, String str2) {
return str1.compareTo(str2);
}
});
StringBuilder builder = new StringBuilder();
for (String str : strs)
builder.append(str);
return builder.toString();
}
}
1.2.3 用Lambda表达式实现比较器
- 用 Lambda 表达式实现自定义比较器:被排序的数组必须为引用数据类型,不能为基本数据类型;
class Solution {
public String minNumber(int[] nums) {
if (nums == null || nums.length == 0)
throw new RuntimeException("Invalid input!");
String[] strs = new String[nums.length];
for (int i = 0; i < nums.length; i++)
strs[i] = String.valueOf(nums[i]);
Arrays.sort(strs, (x, y) -> (x + y).compareTo(y + x));
StringBuilder res = new StringBuilder();
for (String s : strs)
res.append(s);
return res.toString();
}
}
2. Summary
2.1 Grammar
- 用函数实现自定义比较器:被排序的数组必须为引用数据类型,不能为基本数据类型;
Arrays.sort(strs, new Comparator<>() {
@Override
public int compare(String str1, String str2) {
return str1.compareTo(str2);
}
});
- 用 Lambda 表达式实现自定义比较器:被排序的数组必须为引用数据类型,不能为基本数据类型;
Arrays.sort(strs, (x, y) -> (x + y).compareTo(y + x));
2.2 算法设计
References