Java演算法面試題(008) 字串反轉
簡介
這是一個Java面試中被經常問及的問題,也有很多種實現方式。我在這裡一一列出,如果你有更好的解法,也可留言。
解法一:首尾字元調換順序
由於String物件是隻讀型別,不能對其進行直接操作,因此需要轉換成字元陣列,然後調換字元陣列中的各個字元。
public String reverse(String str) {
//異常情況處理
if (str == null || str.length() <= 1) {
return str;
}
//調換首尾字元
char[] array = str.toCharArray();
int len = str.length();
for (int i = 0; i < len/2; i++) {
char temp = array[i];
array[i] = array[len - 1 - i];
array[len - 1 - i] = temp;
}
//產生新字串
return new String(array);
}
這個演算法實現需要注意的時,遍歷時,到達中間節點遍歷結束;如果操作遍歷到尾部,相當於將字串首尾調換後,又調換回原來的狀態。
解法二:遞迴實現
遞迴演算法的話可以每次將字串首部字元追置換到尾部,並拼接成新的字串;當字串裡僅有一個字元存在時,結束遞迴呼叫。
public String reverse(String str) {
//異常情況處理
if (str == null || str.length() <= 1) {
return str;
}
//遞迴實現
return reverse(str.substring(1)) + str.charAt(0);
}
解法三:使用StringBuffer的reverse()函式
藉助StringBuffer/StringBuilder的reverse()函式,可以實現字串的反轉,但需要在StringBuffer/StringBuilder和String型別之間進行轉換。這裡需要注意一下StringBuffer和StringBuilder的差異:StringBuffer是執行緒安全的,StringBuilder是非執行緒安全的。
public String reverse3(String str) {
//異常情況處理
if (str == null || str.length() <= 1) {
return str;
}
StringBuilder stringBuilder = new StringBuilder(str).reverse();
return stringBuilder.toString();
}
解法四:使用棧的方法實現
字串反轉過程,有點類似堆疊的操作,將字串push到堆疊中,然後在pop出來,採用先進後出,實現字串的反轉。
public String reverse(String str) {
//異常情況處理
if (str == null || str.length() <= 1) {
return str;
}
char[] array = str.toCharArray();
Stack<Character> stack = new Stack<Character>();
for (char c:array) {
stack.push(c);
}
//使用length暫存堆的大小,因為遍歷的過程中,會改變堆的大小
int length = stack.size();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < length; i++) {
builder.append(stack.pop());
}
return builder.toString();
}
在這個實現中,使用了StringBuilder來儲存字串。如果你使用String型別做拼接,會影響效率,想想為什麼?
總結
這裡列出的四種比較經典的字串反轉的實現方法,從效率上分析,實現1和效率3效率應該比較高,這塊需要檢視一下StringBuilder的原始碼。但如果面試時,能列出這幾種演算法並對比一下,應該會給面試官比較深的印象。
相關文章
- Java演算法面試題(003) 如何檢查一個字串是另外一個字串的旋轉字串Java演算法面試題字串
- 反轉字串字串
- 字串反轉字串
- Amazon 面試題 | 反轉母音字母面試題
- 反轉字串(JavaScript)字串JavaScript
- 華為-字串反轉字串
- JavaScript 字串反轉JavaScript字串
- java 反轉單連結串列,偶爾會遇到的面試題Java面試題
- 在Java中反轉字串的10種方法[Snippets]Java字串
- 當Python面試 碰到 反轉字串,你會怎麼做?Python面試字串
- 字串-面試題字串面試題
- 字串或數字反轉字串
- 面試反問問題面試
- Day7(字串)|344.反轉字串 541.反轉字串II 54.替換數字字串
- 資料結構和演算法面試題系列—字串資料結構演算法面試題字串
- [演算法總結] 13 道題搞定 BAT 面試——字串演算法BAT面試字串
- 將一個字串進行反轉:將字串中指定部分進行反轉。比如“abcdefg”反轉為”abfedcg”字串
- Java演算法面試題(009) 毒酒問題Java演算法面試題
- javascript 字串字元順序反轉JavaScript字串字元
- Leedcode-反轉字串 II字串
- JavaScript練習題目(2)文字域內的字串反轉JavaScript字串
- 必須要會回答的Java面試題(字串篇)Java面試題字串
- 陳皓:為什麼我反對純演算法面試題演算法面試題
- 我倒在了美團面試演算法題:字串大數相加面試演算法字串
- Facebook 面試題 | 字串相加面試題字串
- Java演算法面試題(006) 相遇問題(阿里)Java演算法面試題阿里
- JAVA字串轉日期或日期轉字串Java字串
- LeetCode初級-反轉字串LeetCode字串
- LeetCode-344-反轉字串LeetCode字串
- 常見物件-字串反轉的案例物件字串
- 常見物件-字串反轉功能案例物件字串
- 程式碼隨想錄演算法訓練營第八天 | 字串:344反轉字串、演算法字串
- 【演算法題】反轉連結串列的兩種方法演算法
- java 字串轉intJava字串
- LeetCode每日一題: 反轉字串中的母音字母(No.345)LeetCode每日一題字串
- 程式碼隨想錄演算法訓練營第8天 | 字串 344.反轉字串 541. 反轉字串II 卡碼網:54.替換數字 151.翻轉字串裡的單詞 卡碼網:55.右旋轉字串演算法字串
- Python中列表和字串的反轉Python字串
- 幾道 BAT 演算法面試中經常問的「字串」問題BAT演算法面試字串