题目要求:请实现一个函数,把字符串中的每个空格替换成"%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指向同一位置时,表明所有空格都已经替换完成。优点:所有的字符只复制或是移动一次,比方法1要快。
#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;
}