面試題5:替換空格
阿新 • • 發佈:2018-08-04
計算 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:替換空格