C++ 中的替換空格

發表於2016-12-25

例,請實現一個函式,把字串中的每個空格替換成“%20”。例如輸入“We are happy.”,則輸出“We%20are%20happy.”。

分析:

我們可以先遍歷一次字串,這樣就能統計出字串中空格的總數,並可以由此計算出替換之後的字串的總長度。每替換一個空格,長度增加2,因此替換以後字串的長度等於原來的長度加上2乘以空格數目。我們還是以前面的字串’We are happy,”為例,”We are happy‘”這個字串的長度是14(包括結尾符號”),裡面有兩個空格,因此替換之後字串的長度是18。

我們從字串的後面開始複製和替換。首先準備兩個指標,P1和P2。P1指向原始字串的末尾,而P2指向替換之後的字串的末尾(如圖(a)所示)。接下來我們向前移動指標P1,逐個把它指向的字元複製到P2指向的位置,直到碰到第一個空格為止。此時字串包含如圖(b)所示,灰色背景的區域是做了字元拷貝(移動)的區域。碰到第一個空格之後,把Pl向前移動1格,在P2之前插入字串”%20″。由於”%20″的長度為3,同時也要把P2向前移動3格如圖(c)所示。

我們接著向前複製,直到到碰到第二個空格(如圖2.4(d)所示)。和上次一樣,我們再把P1向前移動1格,並把P2向前移動3格插入”%20″(如圖2.4(e)所示)。此時P1和P2指向同一位置,表明所有空格都已經替換完畢。   從上面的分析我們可以看出,所有的字元都只複製(移動)一次,因此這個演算法的時間效率是O(n),效率比較高。

注:圖中帶有陰影的區域表示被移動的字元。

(a)把第一個指標指向原字串的末尾,把第二個指標指向替換之後的字串的末尾。

(b)依次複製字串的內容,直至第一個指標碰到第一個空格。

(c)把倒數第一個空格替換成”%20″,接著,把第一個指標向前移動1格,把第二個指標向前移動3格。

(d)依次向前複製字串中的字元,直至碰到空格。

(e)替換字串中的倒數第二個空格,接著,把第一個指標向前移動1格,把第二個指標向前移動3格。

在面試的過程中,我們也可以和前面的分析一樣,畫一兩個示意圖,解釋自己的思路,這樣既能幫助我們理清思路,也能使我們和麵試官的交流變得更加高效。在面試官肯定我們的思路之後,就可以開始寫程式碼了。下面是參考程式碼:

測試用例:

1)輸入的字串中包含空格(空格位於字串的最前面,空格位於字串的最後面,空格位於字串的中間,字串中有連續多個空格)。
2)輸入的字串中沒有空格。
3)特殊輸入測試(字串是個NULL指標、字串是個空字串、字串只有一個空格字元、字串中只有連續多個空格)。

//測試程式碼:

//主函式

效果如下:

參考文獻:何海濤.《劍指Offer名企面試官精講典型程式設計題》.2012年.電子工業出版社

相關文章