窗外的大廈,桌子上的水杯,手中的筆。
面試官:“先來一點基礎的吧,用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技術干貨。
我茅塞頓開,這次面試真的是學到了。
本故事純屬虛構,如有雷同實屬巧合。