1. 程式人生 > >面試題5:替換空格

面試題5:替換空格

計算 style happy off tar inter 因此 長度 內容

// 面試題5:替換空格
// 題目:請實現一個函數,把字符串中的每個空格替換成"%20"。例如輸入“We are happy.”,
// 則輸出“We%20are%20happy.”。

解題思路:

簡單粗暴的方法就是,從前往後依次掃描,碰到空格就先把空格後邊的字符串都後移兩個單位,然後把‘ ’依次改寫成‘%’‘2’‘0’,

但是第二個空格之後的字符串會被移動多次,時間開銷比較大。

技術分享圖片

假設字符串的長度是n,對於每個空格字符,後面需要移動的字符數為O(n),

因此對於含有O(n)個空格字符的字符串而言,總的時間效率是O(n^2)。

為了減少時間開銷,可以嘗試減少字符串的移動次數,從字符串尾部開始移動,

一次性就把字符放到它應該在的位置上,而不是從前向後,每次移動兩個單位。

技術分享圖片

首先,從前到後遍歷字符串,計算字符串實際長度與空格數量,然後計算出字符串的新長度。

兩個指示標誌p1和p2,p1指向原字符串結尾‘\0’,p2指向新字符串的結尾(‘\0’將被移動到的位置)。

如果p1指向‘ ’,p2填入‘0’,向前移一位,填入‘2’,向前移一位,填入‘%’,向前移一位,p1再向前移一位。

如果p1不指向‘ ’,直接將p1內容填入p2,p1 p2向前移一位即可。

當p1<p2且p1>=0時,重復上述過程,就可以將字符串中的‘ ’替換為‘%20’

第二種方法中,所有的字符串只會被復制和移動一次,時間開銷是O(n)。

偽代碼:

if(參數輸入不合法)
    return
; while(未遍歷到\0){ ++字符串長度; if(遍歷到 ) ++空格數量; ++i; } 計算新字符串長度; 定義原有和新字符串指示標誌p1 p2; while(p1<p2&&p1>=0){ if(p1== ){ p2依次填入0‘‘2‘‘%並移動; } else p2=p1; 移動p2; p1前移; }

c/c++:

void ReplaceBlank(char str[], int length) {
    
//校驗參數有效性 if (str == nullptr || length <= 0) return; //統計字符串實際長度與空格數量 int originalLength = 0; int numberOfBlank = 0; int i = 0; while (str[i] != \0) { originalLength++; if (str[i] == ) numberOfBlank++; i++; } //計算字符串新長度 //定義原有和新的指示標誌 int newLength = originalLength + 2 * numberOfBlank; int indexOfNew = newLength; int indexOfOriginal = originalLength; //兩個指示標誌不相遇且原字符串未遍歷完成 while (indexOfNew > indexOfOriginal&&indexOfOriginal >= 0) { if (str[indexOfOriginal] == ) { str[indexOfNew--] = 0; str[indexOfNew--] = 2; str[indexOfNew--] = %; } else str[indexOfNew--] = str[indexOfOriginal]; indexOfOriginal--; } }

參考資料:

劍指offer第二版面試題5

面試題5:替換空格