劍指Offer面試題4 替換空格
阿新 • • 發佈:2018-11-11
題目要求:請實現一個函式,把字串中的每個空格替換成"%20"。例如輸入"We are happy.",則輸出"We%20are%20happy."
解題思路1:在原有的字串上進行替換,將原來的一個空格替換成"%"、"2"、"0"這3個字元(字串會因此變長,我們要保證原有的字串後面有足夠多的空餘記憶體)。做法是掃描字串每一次遇到空格時做替換,將一個字元替換成3個字元,然後將空格後面的所有字元都向後移2個字元。不足:若有多個空格就會發現有很多字元都移動了多次。
解題思路2:建立一個新的字串,然後在新的字串上做替換。首先遍歷字串求出串中空格的數量,求出替換之後字串的總長度(每替換一個空格,長度加2)。做法是從字串的後面向前複製和替換。有2個指標p1、p2,p1指向原字串的尾,p2指向替換之後的字串的尾。接下來向前移動指標p1,逐個的將p1指向的字元複製到p2指向的位置,碰到空格時,p1向前移動一格,在p2之前插入字串"%20",再將p2向前移動3個。當p1和p2指向同一位置時,表明所有空格都已經替換完成。優點
#include <iostream> using namespace std; void ReplaceBlank(char string[],int length) { if(string == NULL || length <= 0) return ; int originalLength = 0; int numberOfBlank = 0; int i=0; while(string[i] != '\0') { ++originalLength; if(string[i] == ' ') ++numberOfBlank; ++i; } int newLength = originalLength + 2*numberOfBlank; if(newLength > length) return ; int indexOfOriginal = originalLength; int indexOfNew = newLength; while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal) { if(string[indexOfOriginal] == ' ') { string[indexOfNew--] = '0'; string[indexOfNew--] = '2'; string[indexOfNew--] = '%'; } else string[indexOfNew--] = string[indexOfOriginal]; --indexOfOriginal; } } int main() { char str[] = "We are happy."; ReplaceBlank(str,100); cout << str << endl; return 0; }