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 条评论
登录 后参与评论

相关文章

来自专栏诸葛青云的专栏

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

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

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

js原型入门

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

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

638. 字符同构哈希映射

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

8530
来自专栏从零开始学自动化测试

python笔记2-冒泡排序

前言 面试的时候经常有面试官喜欢问如何进行冒泡排序?这个问题相信能难倒一批英雄好汉,本篇就详细讲解如何用python进行冒泡排序。 一、基本原理 1.概念: 冒...

38960
来自专栏布尔

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

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

227100
来自专栏LuckQI

Redis初识~Set命令

12420
来自专栏技术小站

(String)、toString、String.valueOf用法区别(转)

在Java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能。本文将对常用的转换方法进行一个总结。

12620
来自专栏大数据钻研

Java到底是不是一种纯面向对象语言?

Java——是否确实的 “纯面向对象”?让我们深入到Java的世界,试图来证实它。 在我刚开始学习 Java 的前面几年,我从书本里知道了 Java 是遵循 ...

302110
来自专栏PPV课数据科学社区

【工具】Python正则表达式的七个使用范例

? 作为一个概念而言,正则表达式对于Python来说并不是独有的。但是,Python中的正则表达式在实际使用过程中还是有一些细小的差别。 本文是一系列关于Py...

35890
来自专栏北京马哥教育

Python正则表达式的七个使用范例

作为一个概念而言,正则表达式对于Python来说并不是独有的。但是,Python中的正则表达式在实际使用过程中还是有一些细小的差别。 本文是一系列关于Pyth...

34650

扫码关注云+社区

领取腾讯云代金券