剑指offer--替换空格

来源:互联网 发布:直通车优化技巧 编辑:程序博客网 时间:2024/06/05 16:42

 请实现一个函数,把字符串中的每个空格替换成%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;}



0 0
原创粉丝点击