/*** 反轉字符串中單詞順序,I am a software engineer -> engineer software a am I* @author liaojiamin* @Date:Created in 16:59 2021/7/1*/publicclassReverStr{publicstaticvoidmain(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)* */publicstaticchar[]reverTwice(char[] target){if(target == null || target.length <=0){return target;}target =reverAll(target,0, target.length -1);int[] isSpace =newint[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;}}}/*** 按指定位置反轉* */publicstaticchar[]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*/publicclassReverPositionStr{publicstaticvoidmain(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)* */publicstaticchar[]reverPosition(char[] target,int position){if(target == null || target.length <=0|| target.length <= position){return target;}char[] result =newchar[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*/publicclassReverPositionStr{publicstaticvoidmain(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)** */publicstaticchar[]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;}/*** 按指定位置反轉* */publicstaticchar[]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;}}