lambda表示式在oj中會比匿名內部類慢

sayWhat_sayHello發表於2018-11-29

引言

今天在刷題的時候遇到了這道題https://leetcode-cn.com/problems/reorder-log-files
。一開始的解法為:

class Solution {
    /**
     * 0 <= logs.length <= 100 | 3 <= logs[i].length <= 100 | logs[i] 保證有一個識別符號,並且識別符號後面有一個字。
     * 字母日誌 排前面 數字排後面且按原本順序| 字母日誌 字典序 數字原樣 忽略識別符號
     */
    public static String[] reorderLogFiles(String[] logs) {
        if(logs.length < 2) {
            return logs;
        }

        List<String> resList = new LinkedList<>();
        List<String> strList = new LinkedList<>();
        for (String str : logs) {
            String[] strings = str.split(" ");
            char c = strings[1].charAt(0);
            if ('0' <= c && c <= '9') {
                resList.add(str);
            }else {
                strList.add(str);
            }
        }

        strList.sort(Comparator.comparing(s -> s.split(" ", 2)[1]));
        int index = 0;
        for (String str : strList){
            resList.add(index++,str);
        }
        return resList.toArray(new String[resList.size()]);

    }
}

發現用時比其他人慢很多,然後開始優化。

具體看註釋部分和存在部分。

class Solution {
    /**
     * 0 <= logs.length <= 100 | 3 <= logs[i].length <= 100 | logs[i] 保證有一個識別符號,並且識別符號後面有一個字。
     * 字母日誌 排前面 數字排後面且按原本順序| 字母日誌 字典序 數字原樣 忽略識別符號
     */
    public static String[] reorderLogFiles(String[] logs) {
        if(logs.length < 2) {
            return logs;
        }

        List<String> resList = new LinkedList<>();
        List<String> strList = new LinkedList<>();
        for (String str : logs) {
            // String[] strings = str.split(" ");
            // char c = strings[1].charAt(0);
            char c = str.charAt(str.indexOf(" ")+1);
            
            if ('0' <= c && c <= '9') {
                resList.add(str);
            }else {
                strList.add(str);
            }
        }

        // strList.sort(Comparator.comparing(s -> s.split(" ", 2)[1]));
        strList.sort(new Comparator<String>(){
            public int compare(String s1, String s2){
                String log1 = s1.substring(s1.indexOf(" "));
                String log2 = s2.substring(s2.indexOf(" "));
                return log1.compareTo(log2);
            }
        });
        // int index = 0;
        // for (String str : strList){
        //     resList.add(index++,str);
        // }
        strList.addAll(resList);
        return strList.toArray(new String[strList.size()]);

    }
}

sort那裡是最後一次進行的優化。優化之後速度猛的提高了…
想想也是,你函數語言程式設計,它還要再解釋解釋。
所以我大膽提高一個觀點:lambda表示式在oj中會比匿名內部類慢。

圖片(論證)

在這裡插入圖片描述

相關文章