JAVA多種方法實現(xiàn)字符串反轉(zhuǎn)
本人自己思考+網(wǎng)絡(luò)搜羅,分類整理了以下4類9種方法:
A類:使用JAVA原生方法
-A1:使用StringBuffer的reverse方法
-A2:使用StringBuilder的reverse方法
B類:遍歷字符串(字符數(shù)組)實現(xiàn)
-B1:將字符串轉(zhuǎn)變?yōu)樽址麛?shù)組,遍歷該數(shù)組的一半,依次將頭尾開始對應(yīng)的字符交換
-B2:逆向遍歷s,正序拼接出一個新的字符串
-B3:正向遍歷s,將取出的字符拼接形成中間字符串,將中間字符串拼接在下一個字符的后面
-B4:從首位兩邊同時遍歷,交換首位下標(biāo)位置的字符(類似于B1)
C類:遞歸實現(xiàn)
-C1:將字符串二分后前后交換,遞歸結(jié)束條件為字符串長度小于等于1
-C2:思路同B3,結(jié)束條件是長度為1
D類:其他實現(xiàn)
-D1:利用棧stack先進(jìn)后出的原理實現(xiàn)
有些方法有重復(fù)和相似的地方,以后如果搜集到不太相同的思路和解法,該帖我還會繼續(xù)維護(hù)~歡迎收藏。如果各位有新的思路也歡迎交流,如果本人有寫錯的地方也歡迎指出。
最后補上代碼和測試。
package cn.daycode.leetcode; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Stack; public class Reverses { public static void main(String[] args) throws InvocationTargetException, IllegalAccessException { Method[] methods = Reverses.class.getDeclaredMethods(); String s1 = "thgir"; String s2 = "aabbcc"; int i = 1; System.out.println("測試字符串為:"+s1+","+s2); // 反射取出Reverses類中所有名字帶reverse的方法,并依次調(diào)用 for (Method m : methods){ if (m.getName().contains("reverse")){ System.out.print(i+++"."); System.out.print("調(diào)用了"+m.getName()+"方法,"); System.out.print("逆序后的結(jié)果為:"+m.invoke(new Reverses(),s1)); System.out.println(","+m.invoke(new Reverses(),s2)); } } } // 方法A1:使用StringBuffer的reverse方法 private static String reverseA1(String s){ return new StringBuffer(s).reverse().toString(); } // 方法A2:使用StringBuilder的reverse方法 private static String reverseA2(String s){ return new StringBuilder(s).reverse().toString(); } // 方法B1:將字符串轉(zhuǎn)變?yōu)樽址麛?shù)組,遍歷數(shù)組的一半,將頭尾開始對應(yīng)的字符交換 private static String reverseB1(String s){ char[] chars = s.toCharArray(); int length = chars.length-1; for (int i = 0; i <= length/2; i++) { if(chars[i] != chars[length - i]) { chars[i] = (char) (chars[i] ^ chars[length - i]); chars[length - i] = (char) (chars[i] ^ chars[length - i]); chars[i] = (char) (chars[i] ^ chars[length - i]); } } return String.valueOf(chars); } // 方法B2:逆向遍歷s,正序拼接出一個新的字符串 private static String reverseB2(String s){ StringBuffer sb = new StringBuffer(""); for (int i = s.length()-1; i >= 0 ; i--) { sb.append(s.charAt(i)); } return sb.toString(); } // 方法B3:正向遍歷s,將取出的字符拼接形成中間字符串,將中間字符串拼接在下一個字符的后面 private static String reverseB3(String s){ String str = ""; for (int i = 0; i < s.length() ; i++) { str = s.charAt(i) + str; } return str; } // 方法C1:遞歸,將字符串二分后前后交換,遞歸結(jié)束條件為字符串長度小于等于1 private static String reverseC1(String s){ if(s.length() <= 1){ return s; } String l = s.substring(0, s.length()/2); String r = s.substring(s.length()/2, s.length()); return reverseC1(r)+reverseC1(l); } // 方法C2:遞歸,思路同B3,結(jié)束條件是長度為1 private static String reverseC2(String s){ if (s.length() <= 1){ return s; } return reverseC2(s.substring(1))+s.charAt(0); } // 方法D1:利用棧stack先進(jìn)后出的原理實現(xiàn) private static String reverseD1(String s){ char[] str = s.toCharArray(); Stack<Character> stack = new Stack<Character>(); for (int i = 0; i < str.length; i++) stack.push(str[i]); StringBuffer sb = new StringBuffer(""); for (int i = 0; i < str.length; i++) sb.append(stack.pop()); return sb.toString(); } // 方法B4:從首位兩邊同時遍歷,交換首位下標(biāo)位置的字符 private static String reverseB4(String s){ char[] chars = s.toCharArray(); int start = 0; int end = chars.length-1; while (start < end){ if(chars[start] != chars[end]) { chars[start] = (char) (chars[start] ^ chars[end]); chars[end] = (char) (chars[start] ^ chars[end]); chars[start] = (char) (chars[start] ^ chars[end]); } start++; end--; } return String.valueOf(chars); } }
到此這篇關(guān)于JAVA多種方法實現(xiàn)字符串反轉(zhuǎn)的文章就介紹到這了,更多相關(guān)JAVA字符串反轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
eclipse連接數(shù)據(jù)庫并實現(xiàn)用戶注冊登錄功能
這篇文章主要介紹了eclipse連接數(shù)據(jù)庫并實現(xiàn)用戶注冊登錄功能的相關(guān)資料,需要的朋友可以參考下2021-01-01struts1之簡單mvc示例_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了struts1之簡單mvc示例的相關(guān)資料,需要的朋友可以參考下2017-09-09springBoot項目中使用@Value取值出現(xiàn)的問題及解決
這篇文章主要介紹了springBoot項目中使用@Value取值出現(xiàn)的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07Mybatis中collection和association的使用區(qū)別詳解
這篇文章主要介紹了Mybatis中collection和association的使用區(qū)別詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11SpringBoot枚舉類型參數(shù)認(rèn)證的實現(xiàn)代碼
項目當(dāng)中經(jīng)常需要接口參數(shù)是否在一個可選的范圍內(nèi),也就是驗證類枚舉參數(shù)的需求,所以本文我們將使用SpringBoot實現(xiàn)枚舉類型參數(shù)認(rèn)證,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-12-12