大話字符串逆序

窗外的大廈,桌子上的水杯,手中的筆。java

面試官:「先來一點基礎的吧,用Java寫一個方法,入參是一個字符串,返回逆序後的字符串。」面試

我暗想確實很基礎,因而便寫下:算法

public static String reverse(String str) {
    StringBuffer sb = new StringBuffer(str);
    return sb.reverse().toString();
}

歡迎關注微信公衆號:萬貓學社,每週一分享Java技術乾貨。微信

面試官看了看,說:「寫的很好,用StringBuffer的reverse方法。若是你來實現其中算法,你會怎麼寫?」app

我直接說:「從最後一個字符開始,一直向前添加字符就能夠了。」從新寫了一個遍代碼:優化

public static String reverse(String str) {
    char[] chars = str.toCharArray();
    StringBuilder sb = new StringBuilder();
    for (int i = chars.length - 1; i >= 0; i--) {
        sb.append(chars[i]);
    }
    return sb.toString();
}

歡迎關注微信公衆號:萬貓學社,每週一分享Java技術乾貨。ui

面試官看了看,說:「寫的很好,逆序的功能完成了。不過再想一想,有什麼能夠優化的地方?」spa

我想了想,說:「好像沒有什麼能夠優化的?」rest

面試官提示了一句:「好比,採用首尾替換的方式呢?是否是能夠減小時間複雜度?」code

我恍然大悟,說:「的確是,我再改一下。」又從新寫了一個遍代碼:

public static String reverse(String str) {
    char[] chars = str.toCharArray();
    int n = chars.length - 1;
    for (int i = 0; i <= n / 2; i++) {
        int j = n - i;
        char temp = chars[i];
        chars[i] = chars[j];
        chars[j] = temp;
    }
    return new String(chars);
}

歡迎關注微信公衆號:萬貓學社,每週一分享Java技術乾貨。

面試官又看了看,說:「寫的很好,就是這個思想。不過再想一想,有什麼能夠優化的地方?」

我冥思苦想一番,說:「應該沒有吧。」

面試官說:「肯定沒有了嘛?」

我確定地回答:「肯定沒有了。」

面試官:「好吧,這個問題先到這。」

我有點不服氣,搶着問到:「您說說,還有什麼能夠優化的地方?」

面試官微笑了一下,說:「我認爲還有兩個地方能夠優化。」

「第一,for循環的布爾表達式裏不該該放除2的計算,不然每次循環都會計算一次。」

「第二,除2的計算能夠用右移一位代替,這樣效率更高。」

面試官在我寫的代碼上改了幾筆,就變成了:

public static String reverse(String str) {
    char[] chars = str.toCharArray();
    int n = chars.length - 1;
    for (int i = (n - 1) >> 1; i >= 0; i--) {
        int j = n - i;
        char temp = chars[i];
        chars[i] = chars[j];
        chars[j] = temp;
    }
    return new String(chars);
}

歡迎關注微信公衆號:萬貓學社,每週一分享Java技術乾貨。

我茅塞頓開,此次面試真的是學到了。

本故事純屬虛構,若有雷同實屬巧合。

相關文章
相關標籤/搜索