题目:实现一个函数,把字符串中的每个空格替换成“%20”。
例如输入“We are happy”,则输出"We%20are%20happy"。
做字符串中空格的替换就要统计出字符串中空格出现的次数,因此遍历字符串,统计字符串的长度以及空格出现的次数。
然后计算下替换之后新字符串的长度。在给字符数组预分配内存大小时,一定要分配的大小比替换之后新字符串的长度要长。
然后在原字符串基础上去修改字符串,为减少时间复杂度,从后到前去修改字符串。
可以采用两个指针,一个指针指向原始字符串的末尾,一个指针指向新字符串的末尾。
然后进行拷贝,直到遇到空格,则在新字符串中插入三个字符‘0’、‘2’、‘%’。
这样所有的字符只复制一次,时间复杂度为O(n).
c++代码如下:
#include <iostream>
using namespace std;
class Solution {
public:
void replaceSpace(char *str, int length) {
//length为字符数组string的总容量
if (str == NULL || length <= 0)
return;
int numOfBlank = 0;
int orgLength = 0;
for (int i = 0; str[i] != '\0'; ++i)
{
++orgLength;
if (str[i] == ' ')
{
++numOfBlank;
}
}
int newLength = orgLength + numOfBlank * 2; //替换之后,由原来的一个空格字符,变成了三个字符。增加了2倍的空格字符长度
if (newLength + 1 > length)
return;
char* pStr1 = str + orgLength;
char* pStr2 = str + newLength;
while (pStr1<pStr2)
{
if (*pStr1 == ' ')
{
*pStr2-- = '0';
*pStr2-- = '2';
*pStr2-- = '%';
}
else
{
*pStr2-- = *pStr1;
}
--pStr1;
}
}
};
int main()
{
char str[100] = "we are happy"; //100表示为这个字符串申请了大小为100的可用空间
cout << "修改之前的字符数组 "<< str << endl;
Solution s;
s.replaceSpace(str, 100);
cout << "修改之后的字符数组 " << str << endl;
return 0;
}
程序测试结果: