面試題5:替換空格
題目:請實現一個函數,把字符串中的每個空格替換成“%20”。例如,輸入“We are happy.”,則輸出“We%20are%20happy.”。
解答:我們可以先遍歷一遍字符串,統計出字符串中空格的數目,由此計算出替換後字符串的長度。可以從字符串的末尾開始複製和替換。首先準備兩個指針p和q,p指向原始字符串的末尾,q指向替換後字符串的末尾。接下來向前移動指針p,逐個把它所指向的字符複製到q所指向的位置。在碰到空格時,把p向前移動1格,在q之前插入字符串“%20”,並把q往前移動三個位置。接着往前複製,直到p和q相遇,表明所有的空格都已替換完畢。此算法中所有的字符都只移動一次,其時間複雜度爲:O(n)。代碼如下:
void replaceSpace(char *str,int length)
{
if(NULL == str || length < 0)
{
return;
}
int spaceNum = 0;
int i = 0;
for(;i < length;i++)
{
if(isspace(str[i]))
{
spaceNum++;
}
}
if(0 == spaceNum)
{
return;
}
int newLength = length + 2*spaceNum;
i = length - 1;
int j = newLength;
str[j--] = '\0';
while(i >=0 && j >= 0 && spaceNum)
{
if(isspace(str[i]))
{
str[j--] = '0';
str[j--] = '2';
str[j--] = '%';
i--;
spaceNum--;
}
else
{
str[j--] = str[i--];
}
}
}