演算法 反轉字串與反轉單詞

2021-08-06 05:35:14 字數 1315 閱讀 5406

題目:

將字串內容進行倒置,比如 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...