题目:
请实现一个函数,把字符串中的每个空格替换成“%20”,例如: 输入“we are happy”输出“we%20are%20happy”
解题思路:
1.在原来的字符串上替换,遇到空格,就替换,把空格后面的内容往后挪
2.重新开辟一个足够多的内存,把之前内存中的内容往里挪
解析:
以上两个方法,都不好,第一个方法的时间复杂度为O(n2),时间复杂度太高了, 第二个方法的空间复杂度高
新思路:
把从前面替换空格,转换为从后面向前替换空格,时间复杂度为O(n)
步骤:
3.把第一个空格进行替换,把第一个指针向前移动一格,第二个指针向前移动3格1.需要两个指针,把第一个指针指向字符串的末尾,把第二个指针指向替换后的字符串的末尾
2.依次复制字符串的内容,直达第一个指针碰到空格
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;
}