题目:
请实现一个函数,把字符串中每个空格替换成“%20”,例如输入“We are happy” ,则输出“We%20are%20happy”
这个题目很简单,只要先统计出空格的个数,计算出新的字符串的长度,从后往前移动即可。时间复杂度为0(n)
主要注意一下几点
(1)字符数组的替换,其长度就会发生变化,变长就有空间不足的情况(考虑在字符串自身上变化,如果新开辟空间的话问题就太简单了),所以首先确保有充足的空间
(2)不要用string类型来存字符串,因为string字符串不能动态的增长,字符串发生变化实际是指向了另外一块空间。
具体实现如下:
#include <iostream>
#include <string>
using namespace std;
//length表示str能够表示的str的最大容量
void ReplaceBlank(char str[], int length)
{
if(str != NULL && length>0)
{
int originalLength = 0; //原字符串的长度
int numberOfBlank = 0; //空格个数
for(int i=0; str[i]!='\0'; i++ )
{
++originalLength;
if(str[i]==' ')
{
++numberOfBlank;
}
}
int newLength = originalLength+2*numberOfBlank;
if(newLength > length)
{//说明str这个数组存不下这个新的字符串
return;
}
for(int i=originalLength; i>=0; --i)
{
if(str[i]==' ')
{
str[newLength--] = '0';
str[newLength--] = '2';
str[newLength--] = '%';
}
else
{
str[newLength--] = str[i];
}
}
}
}
/************************************************************************/
/* 测试用例
1.有正常空格
2.前有空格
3.前后都有空格
4.后有空格
5.没有空格
6.全是空格
7.NULL的情况
8.字符串为空串
*/
/************************************************************************/
void Test(char *testName, char str[], int length, char expected[])
{
if(testName == NULL)
{
cout<<testName<<" begin:";
}
ReplaceBlank(str,100);
if(expected == NULL && str == NULL)
{
cout<<"Passed"<<endl;
}
else if(expected == NULL && str != NULL)
{
cout<<"Failed"<<endl;
}
else if(strcmp(str,expected) == 0)
{
cout<<"Passed"<<endl;
}
else
{
cout<<"Failed"<<endl;
}
}
void Test1()
{
char str[100] = "We are happy";
Test("Test1", str, 100, "We%20are%20happy");
}
void Test2()
{
char str[100] = " are happy";
Test("Test2", str, 100, "%20are%20happy");
}
void Test3()
{
char str[100] = " are ";
Test("Test3", str, 100, "%20are%20");
}
void Test4()
{
char str[100] = "We are ";
Test("Test4", str, 100, "We%20are%20");
}
void Test5()
{
char str[100] = "happy";
Test("Test5", str, 100, "happy");
}
void Test6()
{
char str[100] = " ";
Test("Test6", str, 100, "%20%20");
}
void Test7()
{
Test("Test7",NULL, 100, NULL);
}
void Test8()
{
char str[100] = "";
Test("Test8", str, 100, "");
}
int main()
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
Test8();
return 0;
}