212. 空格替换先扩充,从后往前处理

设计一种方法,将一个字符串中的所有空格替换成 %20 。你可以假设该字符串有足够的空间来加入新的字符,且你得到的是“真实的”字符长度。 你的程序还需要返回被替换后的字符串的长度。

注意事项

如果使用 Java 或 Python, 程序中请用字符数组表示字符串。 样例 对于字符串"Mr John Smith", 长度为 13 替换空格之后,参数中的字符串需要变为"Mr%20John%20Smith",并且把新长度 17 作为结果返回。

先扩充,从后往前处理

这个说是字符串,实际上是字符数组,并没有用c++STL的string来做,要是那样就太简单了,因为string本身支持+操作,只要遍历遇到空格用%20代替加上就可以了,如果是字符数组的话就难一些。 容易想到的还是去遍历,遇到空格用%20来代替,从前向后遍历的话有一个问题,就是一个空格的地方放不下三个字符,要不先把后面的两个字符另外存起来,要不就会丢失数据,而且存起来是很麻烦的,因为要插入这个数据。 还有一种方法是:新建一个字符数组,然后逐个去放,但是这个题要求原位处理,所以不行。

所以一个可行的思路是把原数组扩大,扩大的容量可以通过检查空格的个数来定,然后用两个指针,从后往前把字符放进去,遇到空格则连续放入%20,因为是从后往前,所以不会出现数据没有地方放的情况。画了个简单的图来说明每一步操作的结果。

其中blank_count是记录当前还有多少个空格没有遍历,这个量可以帮助我们找到要写入的字符的位置。而且每次处理完一个这个blank_count--。具体的处理细节见代码:

int replaceBlank(char string[], int length) {
        int blank_count=0;
        int new_length=length;
        for(int i=0;i<length;i++)
        {
            if(string[i]==32)
            blank_count++;
        }
        new_length+=blank_count*2;
        
        for(int i=length-1;i>=0;i--)
        {
            if(string[i]!=32)                   //如果不是空格,就把这个值放进去,从后往前
            {
                string[i+2*blank_count]=string[i];
            }
            else                                //如果是空格,则需把空格替换成三个字符`%20`
            {
                string[i+2*blank_count]='0';
                string[i+2*blank_count-1]='2';
                string[i+2*blank_count-2]='%';
                blank_count--;            //这个见1,则下次的遍历就会减3,因为这个要乘以2,再加上i要减一。
            }
            
        }
        return new_length;
        
        // write your code here
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏达摩兵的技术空间

js原型入门

本文主要是根据《head first javascript程序设计》摘抄学习而成,学习采用这本书主要是一位阿里大佬的建议,经过近期的学习阅读,发现确实比其他的j...

1171
来自专栏和蔼的张星的图像处理专栏

638. 字符同构哈希映射

给定两个字符串 s 和 t ,确定它们是否是同构的。 两个字符串是同构的如果 s 中的字符可以被替换得到 t。 所有出现的字符必须用另一个字符代替,同时保留...

633
来自专栏keyWords

JavaScript之作用域和闭包

801
来自专栏java一日一条

那些经常被遗忘的 Java 面试题

静态内部类实际上与普通类(即类名必须与文件名一样的顶级类)一样,只是静态内部类在某一类的内部定义了而已,既然是类,要想使用就必须实例化。概念上与静态变量、静态方...

691
来自专栏布尔

想起温习一下JS中的this apply call arguments

很多时候讲到语言入门,大家会认为就是要了解一下语言的语法、数据类型和常用函数。这一课对于所有的计算机专业的毕业生来说都可以自学,然而在最近的实践中(带了两个实习...

21310
来自专栏JetpropelledSnake

Python入门之面向对象编程(一)面向对象概念及优点

本文分为如下几个部分 首先说明面向对象是什么,然后结合实际例子说明面向对象的如下几个优点 方便函数管理 数据封装 对象操作 最后总结一下面向对象的好处 概念...

3727
来自专栏编程坑太多

js数组、json、js对象的区别与联系

1984
来自专栏我和PYTHON有个约会

15. 程序编程进阶:函数的返回值

函数中代码块执行的结果,如果我们后面的代码中需要用到,就需要函数返回我们执行的结果,就是需要返回值;

1122
来自专栏诸葛青云的专栏

C语言入门基础学习函数?来看我就告诉你!

在前面我们已经讲过了一些简单的函数,如程序的主函数main()、标准输出函数printf()。在C语言中,大多数功能都是依靠函数来实现的。But,你知道什么是函...

1233
来自专栏PHP实战技术

解构赋值,你不能不懂!

14510

扫码关注云+社区