面试题4-替换空格

题目:

请实现一个函数,把字符串中每个空格替换成“%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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值