大話字符串逆序


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

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

我暗想確實很基礎,於是便寫下:

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

歡迎關注微信公眾號:萬貓學社,每周一分享Java技術干貨。

面試官看了看,說:“寫的很好,用StringBuffer的reverse方法。如果你來實現其中算法,你會怎么寫?”

我直接說:“從最后一個字符開始,一直向前添加字符就可以了。”重新寫了一個遍代碼:

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技術干貨。

面試官看了看,說:“寫的很好,逆序的功能完成了。不過再想想,有什么可以優化的地方?”

我想了想,說:“好像沒有什么可以優化的?”

面試官提示了一句:“比如,采用首尾替換的方式呢?是不是可以減少時間復雜度?”

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

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技術干貨。

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM