您的位置:首页 > Web前端

[剑指Offer]替换空格

2017-04-12 20:55 295 查看

今天看题的时候,遇到一个替换空格的题目,分析一下哈。

题目要求:把字符串中的每个空格替换成“%20”。例如输入“we are happy”,则输出“we%20are%20happy”。

解题思路:我们首先想到的是:移位思想。遇到空格就将空格后的所有字符后移两位,然后填充空格为%20。

实现代码

#pragma once
#include<assert.h>
#include<string.h>

char* StrReplace(char* str,size_t length)
{
assert(str && length > 0);
char *p = str;
char *p1 = str;
size_t len = strlen(str)+1;
size_t i = len;
while(p)
{
while(*p != ' ')
{
p++;
if(*p == '\0')
{
return str;
}
}

while((p1+i) != p)
{
*(p1+i+1) = *(p1+i-1);
i--;
}
len+=2;
i = len;
*p = '%';
*(p+1) = '2';
*(p+2) = '0';
p+=2;
}
return str;
}

void Test()
{
char str[20] = "we are happy";
cout<<StrReplace(str,20)<<endl;
}


但是,我们再看看它的时间复杂度哈。显然,每次移位操作都是O(N),这样经过多次移位,使它的时间复杂度就变为O(N^2)。这样的效率实在有点低。我们如何提高它的时间复杂度呢?

思路2:我们可以用计数的方式,统计字符串中总共的空格数,然后从后向前移位,使用两个指针,p1指向字符串开始的位置,p2指向字符串尾部,移位将p2移动2*空格个数位,遇到空格后填充,直到两指针相遇,才停止移位。如图所示(移位过程):



实现代码

#pragma once
#include<assert.h>
#include<string.h>
char* StrReplace(char* str,size_t length)
{
assert(str && length > 0);
char *p = str;
char *p1 = NULL;
char *p2 = NULL;
size_t len = strlen(str);
int count = 0;
//统计空格数
while(*p != '\0')
{
if(*p == ' ')
count++;
p++;
}
count*=2;

p1 = str+len;        //指向字符串尾
p2 = str+len+count;  //指向修改后字符串正确的位置

while(p1 != p2)
{
if(*p1 == ' ')
{
p2 -= 2;
*p2 = '%';
*(p2+1) = '2';
*(p2+2) = '0';
if(p1 != p)    //如果p1没有到字符串头时再减,防止越界
{
p1--;
p2--;
}
}
else              //不是空格则直接后移
{
*p2 = *p1;
p1--;
p2--;
}

}

return str;
}

void Test()
{
char str[20] = "we are happy";
cout<<StrReplace(str,20)<<endl;
char str1[20] = " are happy";
cout<<StrReplace(str1,20)<<endl;
}


执行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c c++ 字符替换