剑指offer面试题:替换空格(将字符串每个空格替换为%20)

题目:请实现一个函数,把字符串的每个空格替换成“%20”。例如:输入:“we are happy.”,则输出:“we%20are%20happy.”

这里考虑的是在原来的字符串上做替换这一种情况:

若我们用直接做法从头到尾扫描字符串,每碰到一个空格就做替换,其空格后面的字符都必须后移两个字节,如图:

剑指offer面试题:替换空格(将字符串每个空格替换为%20)_第1张图片

浅黄色背景代表需要移动的字符,紫色背景代表需要移动两次的字符,因此,若这样做,有O(n)个空格的话总时间效率为O(n^2),所以我们要寻找一种更快的方法,那就是把从前向后替换改成从后向前替换

如图过程:

剑指offer面试题:替换空格(将字符串每个空格替换为%20)_第2张图片
 
先遍历一次字符串,统计空格数目,然后计算出替换后字符串总长度,然后设两个指针p1,p2, p1指向原字符串末尾,p2指向替换之后字符串末尾,向前移动p1,逐个将其指向的字符复制到p2指向的空间,若遇到空格,p1向前移动1位,在p2之前插入“%20”,在将p2向前移动3位。 具体代码实现:
 
#include 
#include 
#include 
void ReplaceBlack(char str[],int lenth)//lenth为字符数组总长度
{
	int numblack=0;
	char *ptr=str;
	int oldlenth=strlen(str);//字符数组原实际长度
	int newlenth=0;
	if(str==NULL&&lenth<=0)
	{
		return;
	}
	while(*ptr)//统计空格数量
	{
		if(*ptr==' ')
		{
			numblack++;
		}
		ptr++;
	}
	if(numblack==0)
	{
		return;
	}
	newlenth=oldlenth+2*numblack;//字符数组替换后新长度
	if(newlenth>lenth)
	{
		return;
	}
	while(oldlenth

 

你可能感兴趣的:(面试题,剑指offer面试题)