題目描述:給定一個字符串,每個單詞以空格字符分開,將其整個字符串反轉.
方法一:使用Java純工具類以及一些特定的API來解決這個問題:
1 /** 2 * 〈一句話功能簡述〉<br> 3 * 〈字符串反轉算法〉 4 * 利用Java提供的特性 5 * @author wangkai_wb 6 * @create 2020/6/19 7 * @since 1.0.0 8 * 解題思路:利用Java語言提供的特性,比如先通過String的split()方法拆分, 9 * 然后通過集合工具類Collection.reverse()方法,最后再返回字符串 10 */ 11 public class StringReverse { 12 public static void main(String[] args) { 13 String str = "the sky is blue"; 14 System.out.println("原字符串:"+str); 15 //使用\\s+正則來以空格拆分字符串 16 String[] strs = str.split("\\s+"); 17 //使用工具類Arrays.asList()將其轉換為list集合 18 List<String> stringList = Arrays.asList(strs); 19 //使用Collections.reverse()方法反轉內容 20 Collections.reverse(stringList); 21 //使用StringJoiner來拼接反轉后的字符串即可 22 str = String.join(" ",stringList); 23 //打印str 24 System.out.println("反轉后的字符串:"+str); 25 } 26 }
測試結果:
方法二:何用雙指針解法,一個指針負責循環遍歷,另一個指針負責條件處理.
1 /** 2 * 〈一句話功能簡述〉<br> 3 * 〈字符串反轉算法〉 4 * 5 * @author wangkai_wb 6 * @create 2020/6/19 7 * @since 1.0.0 8 * 解題思路:使用雙指針的核心思想:一個指針負責循環遍歷,另一個指針負責條件處理 9 */ 10 public class StringReverse1 { 11 public static void main(String[] args) { 12 String str = "the sky is blue"; 13 System.out.println("原字符串:"+str); 14 //定義左右指針,右指針不動,左指針向左移動取單詞 15 int right = str.length() -1; 16 int left = right; 17 //存放反轉后的字符串 18 StringBuilder stringBuilder = new StringBuilder(); 19 while (left >= 0){ 20 //查找第一次出現的空格 21 while (left>=0 && str.charAt(left) !=' ') 22 left --; 23 //將單詞方到stringBuilder對象中 24 stringBuilder.append(str.substring(left+1,right+1)+" "); 25 //跳動單詞之間的空格 26 while (left >= 0 && str.charAt(left) ==' ') 27 left --; 28 //right指向下個單詞的詞尾,左指針繼續前進 29 right = left; 30 } 31 //去掉末尾的空格 32 System.out.println("反轉后的字符串:"+stringBuilder.toString().trim()); 33 } 34 }
測試結果:
方法三:使用雙端隊列實現
1 /** 2 * 〈一句話功能簡述〉<br> 3 * 〈字符串反轉算法〉 4 * 5 * @author wangkai_wb 6 * @create 2020/6/19 7 * @since 1.0.0 8 * 解題思路:因為雙端隊列可以支持從隊列頭部插入的方法, 9 * 所以我們可以將字符串中的單詞一個一個進行處理, 10 * 然后將每一個單詞push到隊列的頭部,再將隊列轉成字符串即可. 11 */ 12 public class StringReverse2 { 13 public static void main(String[] args) { 14 String str = "the sky is blue"; 15 System.out.println("原字符串:"+str); 16 int left = 0; 17 int right = str.length() -1; 18 //構建雙端隊列 19 Deque<String> deque = new ArrayDeque<>(); 20 StringBuilder word = new StringBuilder(); 21 while (left <= right){ 22 char charStr = str.charAt(left); 23 if ((word.length() !=0) && (charStr ==' ')){ 24 //將單詞push到隊列的頭部 25 deque.offerFirst(word.toString()); 26 word.setLength(0); 27 28 }else if (charStr != ' '){ 29 word.append(charStr); 30 } 31 ++left; 32 } 33 deque.offerFirst(word.toString()); 34 System.out.println("反轉后的字符串:"+String.join(" ",deque)); 35 } 36 }
測試結果: