日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法--翻转单词顺序

發布時間:2023/12/4 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法--翻转单词顺序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

翻轉單詞順序

  • 題目:輸入一個英文句子,翻轉句子中的單詞順序,但是單詞內的字符順序不變,例如:I am a software engineer -> engineer software a am I
方案一:空間換時間
  • 空間換時間方法,還是如上案例中,I am a software engineer,分析如上:
    • 統計出字符串中空格位置,按空格拆分
    • 通過空格的順序逐個拆解原字符串
    • 將拆解后的字符串按照單詞從后面開始復制
    • 例如最后一個空格位置 15,那么第一個單詞的位置應該是15+1 ~ str.length-1
    • 依次類推逐個向前復制
    • 如下圖所示
  • 如上分析有如下代碼:
/*** 反轉字符串中單詞順序,I am a software engineer -> engineer software a am I* @author liaojiamin* @Date:Created in 16:59 2021/7/1*/ public class ReverStr {public static void main(String[] args) {String str = "I am a software engineer";char[] target = str.toCharArray();char[] result = reverMyStr(target);for (char c : result) {System.out.print(c);}}/*** 方案一:空間換時間方法,* 空間復雜度O(n),時間復雜度O(n)* */public static char[] reverMyStr(char[] target){if(target == null || target.length <= 0){return target;}int[] isSpace = new int[target.length];int positionSpace = 0;char[] result = new char[target.length];int resultPosition = 0;for (int i = 0; i < target.length; i++) {if(target[i] == ' '){isSpace[positionSpace++] = i;}}int positionEnd = target.length -1;positionSpace--;for (int i = positionSpace; ; i--) {int start = 0;if(i>=0){start = isSpace[i] + 1;}result = splitCharArray(start, positionEnd, target, result, resultPosition);resultPosition += (positionEnd - start +1);if(start != 0){//最后一次不需要再添加空格result[resultPosition++]=' ';positionEnd = isSpace[i] -1;}if(start == 0){return result;}}}public static char[] splitCharArray(int start, int end, char[] target, char[] result, int position){for(int i=start; i <=end;i++){result[position++] = target[i];}return result;} }
  • 方案一中其實就是模擬一個字符串拆分函數split,只是在拆分后在對具體的單詞進行順序的變化,整體時間復雜度,第一次遍歷得出拆分點空格,第二次逐個對拆分后的字符進行復制,所以時間復雜度O(n),空間復雜度O(n)
方案二:多次翻轉
  • 本題中需要得到單個單詞順序上的翻轉,但是實際字符是正向的,分析如下:
    • 翻轉字符串,得到一個完全翻轉的,此時目的在于,然后面的單詞位置能移動到簽名,實現單詞順序的變化
    • 此時得到的是一個單詞,字母都是逆序的字符串
    • 統計現有字符串中空格,依據空格區分每個單詞
    • 分別對每個單詞字符串進行單獨翻轉得到最終結果。
    • 如下圖:

  • 經如上分析有如下代碼:
/*** 反轉字符串中單詞順序,I am a software engineer -> engineer software a am I* @author liaojiamin* @Date:Created in 16:59 2021/7/1*/ public class ReverStr {public static void main(String[] args) {String str = "I am a software engineer";char[] target = str.toCharArray();char[] result_1 = reverTwice(target);for (char c : result_1) {System.out.print(c);}}/*** 方案二:反轉兩次* 先全部反轉字符,在逐個單詞顛倒* 時間復雜度O(n) 空間復雜度O(1)* */public static char[] reverTwice(char[] target){if(target == null || target.length <= 0){return target;}target = reverAll(target, 0, target.length -1);int[] isSpace = new int[target.length];int positionSpace = 0;for (int i = 0; i < target.length; i++) {if(target[i] == ' '){isSpace[positionSpace++] = i;}}positionSpace--;int start = 0;for (int i = 0; ; i++) {int end = target.length -1;if(i <= positionSpace){end = isSpace[i] - 1;}target = reverAll(target, start, end);if(i <= positionSpace){start = isSpace[i] +1;}else {return target;}}}/*** 按指定位置反轉* */public static char[] reverAll(char[] target, int start, int end){while (start < end){char temp = target[start];target[start] = target[end];target[end] = temp;start++;end--;}return target;} }

變種題型

  • 題目:定義字符串的左旋轉操作就是把字符串簽名的若干字符轉移到字符的尾部。請定義一個函數,實現字符串的左旋操作功能, 例如輸入字符串I am a software engineer 4 -> a software engineerI am
方案一:空間換時間
  • 最直觀的方法,直接定義一個新的數組復制需要的段。分析如下:
    • 如上題案例中,只需要將指定前面的字符轉到最后,如果用字符串移動每個字符都要操作 指定數子的次數
    • 如果定義新的數組,則只需要將指定階段復制過去
    • 如上指定位4,我們先將后面字符串 5~length-1 位置的字符復制到新數組開始位置
    • 然后將0~4 位置數組復制到新數組的后面
    • 得到的新數組就是我們需要的結果
    • 如下圖

  • 如上分析有如下代碼
/*** 指定位置反轉字符串* 案例 I am a software engineer 4 -> a software engineerI am* @author liaojiamin* @Date:Created in 18:47 2021/7/1*/ public class ReverPositionStr {public static void main(String[] args) {char[] target = "I am a software engineer".toCharArray();char[] result = reverPosition(target, 4);for (char c : result) {System.out.print(c);}}/*** 方案一:空間換時間* 時間復雜度O(n),空間復雜度O(n)* */public static char[] reverPosition(char[] target, int position){if(target == null || target.length <= 0 || target.length <= position){return target;}char[] result = new char[target.length];int positionResult = 0;for (int i = position; i < target.length; i++) {result[positionResult++]=target[i];}for(int i=0;i<position;i++){result[positionResult++] = target[i];}return result;} }
  • 如上案例實現,遍歷一次數組即可完成復制,因此時間復雜度O(n),空間復雜度顯然是O(n)
方案二:多次翻轉
  • 依據第一題中的思路,有如下分析:
    • 既然需要翻轉指定位置,我們可以將本字符串看成是兩個單詞,
    • 本次單詞通過指定的位置進行拆分,這樣理解的話就和第一題是一模一樣的
    • 我們依然多次翻轉,第一次全文翻轉,得到一個順序上是正確的字符
    • 第二次,依據指定位置4,此時的位置應該是 length-1-4+1 ~length-1的位置翻轉
    • 第三次,翻轉0~length-1-4 的位置,得到我們需要的值

  • 如上分析有如下代碼:
/*** 指定位置反轉字符串* 案例 I am a software engineer 4 -> a software engineerI am* @author liaojiamin* @Date:Created in 18:47 2021/7/1*/ public class ReverPositionStr {public static void main(String[] args) {char[] target = "I am a software engineer".toCharArray();char[] result_1 = reverPositionTwice(target, 4);for (char c : result_1) {System.out.print(c);}}/*** 方案二:反轉兩次* 時間復雜度O(n)** */public static char[] reverPositionTwice(char[] target, int position){if(target == null || target.length <= 0 || target.length <= position){return target;}target = reverAll(target, 0, target.length -1);target = reverAll(target, 0, target.length-1 - position);target = reverAll(target, target.length-1 - position + 1, target.length-1);return target;}/*** 按指定位置反轉* */public static char[] reverAll(char[] target, int start, int end){while (start < end){char temp = target[start];target[start] = target[end];target[end] = temp;start++;end--;}return target;} }

上一篇:數據結構與算法–有序數組中找出和為s的兩個數字
下一篇:數據結構與算法–判斷撲克牌是否順子

總結

以上是生活随笔為你收集整理的数据结构与算法--翻转单词顺序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。