LeetCode刷题技——排序

108 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情


最近一直在力扣刷题,也逐渐对各类题型有了自己的理解,所谓见招拆招,将自己的浅显经验分享一下,帮助更多在编程路上的朋友们。


先从排序开始!

如果题目中对数组的元素位置无要求,或者说改变数组元素位置并不会影响结果时,第一反应就是要对数组进行排序

排序默认为升序排序,若想降序排序,或者更复杂的排序方式,例如,将Map中的key根据其value大小排序,通俗来说,就是对于一个存放 <姓名,成绩> 的Map,我们想获得一个根据成绩排名的姓名数组,虽然说数组中存放的是姓名,但是我要根据其对应的成绩来排序,这就可以通过重写比较器来实现。

比较器Comparator

还是上面的例子

List<String> list = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
map.put("jack", 66);
map.put("tom", 40);
map.put("tifa", 98);
list.add("jack");
list.add("tom");
list.add("tifa");
Collections.sort(list, new Comparator<String>() {
    public int compare(String s1, String s2) {
        return map.get(s1) - map.get(s2);
    }
});
//此时list为["tom", "jack", "tifa"]

对于compare(Object o1, Object o2)方法的:

分享一下个人的记忆方法,

该方法只作用于两个元素之间的比较,确定二者是否符合我们需要的序列

参数先写o1。后写o2,表示在原序列中,o1在前,o2在后

如果返回值大于零,二者交换顺序,如果小于等于零,则报持不变。

lambda表达式

List<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(8);
Collection.sort(list, (o1, o2) -> o2 - o1);//降序排序

String[] arr = new String[3]{"aba", "bbbbb", "c"};
Arrays.sort(arr, (o1, o2) -> o1.length() - o2.length());//根据字符串长度升序排序

数组

对于数组来说,排序使用Arrays.sort()

这里有个坑需要注意,Arrays.sort()方法,只有对象数组可以重写比较器,基本类型的数组只能升序排序

List

Collections.sort()

List中存放的都是对象,故任何类型的数据都可以重写比较器