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

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

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

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

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

如图过程:

 
先遍历一次字符串,统计空格数目,然后计算出替换后字符串总长度,然后设两个指针p1,p2, p1指向原字符串末尾,p2指向替换之后字符串末尾,向前移动p1,逐个将其指向的字符复制到p2指向的空间,若遇到空格,p1向前移动1位,在p2之前插入“%20”,在将p2向前移动3位。具体代码实现:
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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<newlenth)
	{
		if(str[oldlenth]!=' ')//依次复制字符串内容
		{
			str[newlenth--]=str[oldlenth--];
		}
		else//空格替换
		{
			oldlenth--;
			str[newlenth--]='0';
			str[newlenth--]='2';
			str[newlenth--]='%';
		}
	}
}
int main()
{
	char str[30]="we are happy.";
	ReplaceBlack(str,30);
	printf("%s\n",str);
	system("pause");
	return 0;
}


 

展开阅读全文

没有更多推荐了,返回首页