大話字符串逆序

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

面試官:“先來一點基礎的吧,用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技術乾貨。

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

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

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

台灣寄大陸海運貨物規則及重量限制?

大陸寄台灣海運費用試算一覽表

您可能也會喜歡…