剑指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
- [剑指offer]替换空格
- [剑指offer]替换空格
- 剑指offer:替换空格
- 替换空格--《剑指offer》
- 剑指Offer:替换空格
- 【剑指offer】替换空格
- 《剑指Offer》--替换空格
- 剑指offer--替换空格
- 【剑指offer】替换空格
- 【剑指offer】空格替换
- 剑指offer-替换空格
- 剑指offer:替换空格
- [剑指offer]替换空格
- 《剑指offer》替换空格
- 剑指offer:替换空格
- 【剑指Offer】替换空格
- 【剑指offer】-替换空格
- 剑指offer 替换空格
- Java5新特性之静态导入、可变参数、增强for循环、自动拆装箱
- java IO流详解(下)
- Android广告图片轮播控件
- 使用SimpleAdapter创建ListView
- Executor框架
- 剑指offer--替换空格
- PyCharm 重构(refactor)快捷键
- shell中$0,$?,$!等的特殊用法
- jQuery选择器之id选择器
- 第一章:开篇
- 2017艾普兰机智云全家福
- 两种方式处理ViewPager点击事件
- TCP 和 UDP 的区别
- 前端框架Aurelia——组件Component(一)