您的位置:首页 > Web前端

剑指offer--替换空格

2017-03-21 19:33 239 查看
 请实现一个函数,把字符串中的每个空格替换成%20.例如:输入"We are happy." 输出"we are%20are%20happy."。

要想实现这个函数,我们最容易想到的是,从头往前遍历,遇到空格就把空格替换换成%20,这种方法最容易想到。但他有一个缺陷,他的时间复杂度为O(n^2).每遇到空格就要把空格以后的字符往后面移,但是后面的字符也可能还有空格。这样就使有的字符多次移动,这样效率太低。

我们可以换个思路从前往后依次替换,我们能不能从后往前依次替换呢?? 答案是肯定的,当然能,而且还很好;

我们可以借助两个指针:front_ptr指向没替换前的字符串的末尾,back_ptr指向要替换后的字符串的末尾。front_ptr与back_ptr的关系为:一个空格替换成三个字符,就相当于有一个空格就多两个字符。所以back_ptr = front_ptr +空格数*(3 - 1);

如何具体实现这个函数呢?

1)首先逐步把front_ptr往前移,并且把内容复制到back_ptr指向的位置,back_ptr也向前移,直到front_ptr遇到空格。

2)遇到空格:front_ptr往前走一步,在back_ptr前插入%20;

循环1),2)直到遍历完



具体代码实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<assert.h>

using namespace std;

//请实现一个函数,把字符串中的每个空格替换成%20.例如
//输入"We are happy." 输出"we are%20are%20happy."。
char* ReplaceBlank(char* str)
{
assert(str);
int count = 0; // 统计空格的个数
char* front_ptr = str;
while (*front_ptr != '\0')
{
if (*front_ptr == ' ')
{
++count;
}
++front_ptr;// front_ptr指向原数组的末尾->'\0'
}

//替换后数组的尾指针
char* back_ptr = front_ptr + count*(3 - 1); // 一个空格增加了两个字符
//开始进行从后往前复制
while (back_ptr > front_ptr)
{
//遇到空格替换成%20. front_ptr往前走一步,back_ptr往前走三步
if (*front_ptr == ' ')
{
*back_ptr-- = '0';
*back_ptr-- = '2';
*back_ptr-- = '%';
--front_ptr;
}
else
{
//没遇到空格,依次复制
*back_ptr-- = *front_ptr--;
}
}
return str;
}

void Test()
{
char str1[50]="We are happy.";
cout << ReplaceBlank(str1) << endl;
char str2[50] = " We are happy.";
cout << ReplaceBlank(str2) << endl;
char str3[50] = " We are happy. ";
cout << ReplaceBlank(str3) << endl;
char str4[50] = "We are happy.";
cout << ReplaceBlank(str4) << endl;
char str5[50] = " ";
cout << ReplaceBlank(str5) << endl;
char str6[50] = "Wearehappy.";
cout << ReplaceBlank(str6) << endl;
char* str7 = NULL;
cout << ReplaceBlank(str7) << endl;
}
int main()
{
Test();
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  剑指offer 经典