窗外的大廈,桌子上的水杯,手中的筆。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技術乾貨。
我茅塞頓開,此次面試真的是學到了。
本故事純屬虛構,若有雷同實屬巧合。