剑指offer(4)-----空格替换

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lingling_nice/article/details/80976801

题目:

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

解题思路:

1.在原来的字符串上替换,遇到空格,就替换,把空格后面的内容往后挪

 2.重新开辟一个足够多的内存,把之前内存中的内容往里挪

解析:

         以上两个方法,都不好,第一个方法的时间复杂度为O(n2),时间复杂度太高了,    第二个方法的空间复杂度高

新思路:

        把从前面替换空格,转换为从后面向前替换空格,时间复杂度为O(n)

步骤:

1.需要两个指针,把第一个指针指向字符串的末尾,把第二个指针指向替换后的字符串的末尾

 2.依次复制字符串的内容,直达第一个指针碰到空格
         3.把第一个空格进行替换,把第一个指针向前移动一格,第二个指针向前移动3格
         4.依次向前复制字符串中的字符,直到碰到空格

         5.替换字符串中的倒数第二个空格,把第一个指针向前移动一格,第二个指针向前移动三格。

过程图:

    

#include<string.h>
#include<iostream>
using namespace std;
//lenth是字符串的总长度
void replace_blank(char str[],int lenth)
{
	if(str==NULL && lenth<0)
	{
		return;
	}
	//len是字符串的有效长度
	int len=strlen(str);
	int count=0;//统计空格的个数
	int k=0;
	while(k<len)
	{
		if(str[k]==' ')
		{
			count++;
		}
		k++;
	}
	
	int i=len-1;//之前字符串的长度
	int j=i+count*2;//这是替换之后的字符串的有效长度
	while(i>=0 && i<j)
	{
		if(str[i]==' ')
		{
			str[j--]='0';
		        str[j--]='2';	
			str[j--]='%';
		}
		else
		{
			str[j--]=str[i];
		}
		i--;
	}
	
}
int main()
{
	char str[50]=" we are   happy";
	int lenth=sizeof(str)/sizeof(str[0]);
	replace_blank(str,lenth);
	cout<<str<<endl;
}


猜你喜欢

转载自blog.csdn.net/lingling_nice/article/details/80976801
今日推荐