題目:
將字串內容進行倒置,比如 i like beijing. 經過函式後變為:.gnijied ekil i。
解題思路:
首先題目說的很明確,就是反轉字串,不是列印,也不是建立乙個新的字串,而是改變原資料,最簡單的思路就是將第乙個字元和最後乙個交換,第二個和倒數第二個交換,依次迴圈,函式可以返回乙個標誌位,也可以啥都不返回:
指標作為函式形參和陣列作為函式形參是一樣的,而且假設我們知道字串的長度,所以我們可以寫出如下**:
#include "iostream"
using
namespace
std;
void reserve(char arr,int length);
int main()
void reserve(char arr,int length)
}
下面我們考慮下還能不能優化,講真,這個這個**沒啥好優化的地方了,這個時間複雜度已經是o(n)了,而o(1)不可能啊。
即便是使用棧或者遞迴,時間複雜度上也是一樣的,而使用棧的話從後向前列印字串會方便一些,但是這個題目要求我們改變原資料。剩下的我們可以考慮是不是可以不用中間變數temp,而是兩個值直接做交換,在這裡需要按位異或操作:
假設有兩個二進數a,b:
a:01
b:10
xor=a^b=b^a=11
a^xor=10=b
b^xor=01=a
我們發現,如果用乙個值按位異或它們的異或,那麼結果是另乙個值,於是只需要修改一部分**:}
反轉字串的問題還可以有一些變體,比如反轉一句話中的單詞:
題目:
將字串內容單詞進行倒置,比如 i like beijing. 經過函式後變為:beijing. like i,這個題目好未來出過筆試題。
解題思路:
單詞的定義是認為有空格隔開的子串,在之前我們已經將字串變成.gnijied ekil i,如果在這個基礎上再把每個單詞用同樣的方法換過來,就實現了beijing. like i。
所以我們需要在遍歷字串,交換的條件就是出現空格:
before =after = 0;
int num = 0;
while (arr[num] != '\0')
before = num+1;
}num++;
}} 不過不幸的是,這個**的時間複雜度是o(n^2)。
字串反轉,單詞反轉
一 字串反轉,共蒐集了 7 種方法 public class stringreversed public static void reverse1 string s char c s.tochararray 方法二 for int i 0 i s.length 2 i for char l c sy...
字串單詞反轉
class solution param s,a string return a string def reversewords self,s if len s 0 return s s join s.split 去掉所有的空格,只保留字元 串 之間的空格 s s.strip strip 去掉字串兩...
字串 反轉單詞不反轉單詞內容
反轉句中的單詞 單詞內容不變 比如 輸入wuhan is dog 輸出 dog is wuhan 和字串迴圈左移類似 兩次反轉 先整體反轉 再用split函式 分割 再依次反轉合併 class solution public string fun string s stringbuffer sb n...