您的位置:首页 > Web前端

剑指offer——字符串替换空格

2017-03-29 22:31 351 查看
题目描述:实现一个函数,把字符串中的每个空格替换成“%20”,例如,输入“we are happy”,输出”we%20are%20happy.”

见到这个题目,我们很容易想到:

//申请一块新空间,存储变化后的字符串,显然不是我们想要的结果
char* Replace(char* array)
{
char temp[100] = {0};
int i = 0;

for(int idx=0; array[idx]!='\0'; ++idx)
{

if(array[idx] == ' ')
{
temp[i++] = '%';
temp[i++] = '2';
temp[i++] = '0';
}
else
{
temp[i] = array[idx];
i++;
}
}
temp[i] = '\0';
return temp;
}




由此,我们可以想到如下方法:

(1)先遍历一次字符串,统计出字符串中空格的总数,并可以由此计算出替换之后字符串总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。(2)然后从后往前开始复制替换。首先准备两个指针,p1和p2,p1指向原始字符串的末尾,p2指向那个替换后字符串的末尾,接下来向前移动指针p1,逐个复制它指向的字符到p2所指的位置,遇到空格的话,p1向前移动一个,p2插入“%20”,p2向前移动三个。(3)遇到下一个空格,重复上述过程,等到p1与p2指向同一位置时,表明替换完成。

代码实现如下:

#include<iostream>
using namespace std;

void ReplaceBlank(char string[], int length)
{
if(string == NULL && length <= 0)
{
return;
}

int originLength = 0; //字符串实际长度
int numberofBlank = 0;
int index = 0;

while(string[index])
{
++originLength;

if(string[index] == ' ')
{
++numberofBlank;
}

++index;
}

int newLength = originLength + numberofBlank*2; //替换后字符串长度

if(newLength > length)
{
return;
}

int indexofOrigin = originLength;
int indexofNew = newLength;

while(indexofOrigin >= 0 && indexofNew > indexofOrigin)
{
if(string[indexofOrigin] == ' ')
{
string[indexofNew--] = '0';
string[indexofNew--] = '2';
string[indexofNew--] = '%';
}

else
{
string[indexofNew--] = string[indexofOrigin];
}

--indexofOrigin;
}
}

void FunTest()
{
char array[100] = "we are happy";
ReplaceBlank(array, 20);

for(int idx=0; array[idx]!='\0'; idx++)
{
cout<<array[idx];
}
cout<<endl;
}

int main()
{
FunTest();
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  20 字符串 空格