劍指Offer 資料結構 05 替換空格

2021-10-21 17:28:17 字數 2224 閱讀 3662

q: 請實現乙個函式,把字串 s 中的每個空格替換成"%20"。

示例 1:

限制:

0 <= s 的長度 <= 10000

這個題目將某字串中的單個字元替換為多個字元,改變了字串的長度,無法直接替換,有2種比較明顯的方法,乙個是構建乙個新的字串,根據每次遍歷的字元決定加入新字串中非空格的單字元還是%20。另外乙個方法較為麻煩需要修改字串的長度,還未替換的字串需要後移,改變原來的位置。第乙個方法邏輯簡單,但需要開闢新的記憶體空間,第二個方法邏輯複雜些,但節約了記憶體的開銷,但由於需要修改原字串後面的記憶體位址,是違背c語言的安全邏輯的,不應該選擇,如果是c++,它本身提供的string有乙個resize方法,可以修改原來的字串大小,所以在c++中可以使用這種方法。

這裡用c語言,不像其他語言可以直接用可變字串,在c語言裡面如果構建新字串,可以用陣列,也可以動態分配記憶體,但都需要知道其長度。

空格是1個位元組,那"%20"是佔的3個位元組,但是原來的字串中含有多少個空格並不知道,如果要知道就需要遍歷一次,還沒開始查詢替換就來一次遍歷,這需要根據字串長度權衡,是先計算出空格還是直接把字串當成全空格的極端情況申請最大的空間,我這裡字串比較小,不希望多一次遍歷,這裡鑑於c語言的特性只能按最大的情況來開闢了,也就是原來字串是len,那現在就是len * 3。

char* replacespace(char* s)

memset(tempstr, 0, replacedlen);

char *p = tempstr;

do else

} while(*(++s) != '\0');

*p = '\0';

return tempstr;

}int main()

複雜度分析:

時間複雜度

空間複雜度

修改c語言字串的溢位位資料違背安全準則,不應該採用,如果是c語言實現本題,請使用第一種方法,但如果是c++,由於字串可以擴容,所以可以直接修改(resize的內部實現可能也是開闢新空間來實現的,不可能保證原位址後面有足夠的連續空間,至少某些情況下會開闢新空間,拷貝內容),這種方法並不優秀,也不通用,這裡只是乙個演算法展示的目的。需要養成 乙個思維,什麼時候倒序遍歷處理,如果按從前到後的遍歷順序處理,將非常麻煩。

用兩個變數或者指標分別指向原字串尾部,和新字串尾部,然後都依次左移,新字串尾部開始將原字串倒序取出來放置,當取出來的是空格就用%20放置到新字串的位置,新字串左移2位,如果取出的不是空格就直接放到新字元對應的位置上。

空格2個,儲存結構如下圖示:

所以新字串長度為 : len-count+count * 3 = len+count*2 = 13+2*2 = 17。

擴容字串大小至17,然後倒序遍歷,依次將原字串倒序的字元放置在新字串尾部,遇到空格替換為%20放置3個字元,前移3個字元,最後2個指向 不同尾部的指標將重合。具體的過程如下圖示:

//新字串長度為 len-count+count * 3 = len+count*2

s.resize(len+count*2);

//倒序遍歷修改

for(int i = len -1, j = s.size()-1; i < j; i--,j--) else

cout輸出:

通過每一次的字元修改輸出可以驗證我們的演算法邏輯。

這個題目比較簡單,很容易想出解法,實際開發中也經常會遇到類似的字串處理,最常用的辦法,也是最安全的方法就是犧牲一點空間,採用構建新字串的方式來實現字串中字元的替換。

但是方法二也給我們提供了乙個思路,遇到將字串擴大的情況,可以採用倒序遍歷的方式,從尾部開始替換。這種思路必須掌握,也是解決很多面試題目的乙個很重要的技巧。

同樣需要再次強調c語言中的字元陣列和字串常量的區別,前者內容可以改變,後者內容無法修改。無論字串常量還是字元陣列,都不可越界操作。

劍指offer系列05 替換空格

請實現乙個函式,把字串s中的每個空格替換成 20 示例 1 限制 0 s 的長度 10000 這個題感覺就十分簡單了,但是,我竟然會想到按照空格拆分字串再重新拼裝,鑽洞中?class solution vec.emplace back s.substr j,size for decltype vec...

劍指 Offer 05 替換空格

劍指 offer 05.替換空格 請實現乙個函式,把字串 s 中的每個空格替換成 20 示例 1 方法一 遍歷新增 由於每次替換從 1 個字元變成 3 個字元,使用字元陣列可方便地進行替換。建立字元陣列地長度為 s 的長度的 3 倍,這樣可保證字元陣列可以容納所有替換後的字元。class solut...

劍指 Offer 05 替換空格

請實現乙個函式,把字串 s 中的每個空格替換成 20 示例 1 限制 0 s 的長度 10000 我的解答 class solution 這道題還是很簡單的,使用replace或者遍歷整個字串,每到空格就新增 20即可。不過在做完後發現,replace和replaceall方法具有差別,replac...