剑指offer编程题 -- 替换空格

题目描述:

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy

分析:

注意这里是将长度为1的空格替换为长度为3的“%20”,字符串的长度增加。

1. 如果允许我们开辟一个新的数组来存放替换空格后的字符串,这道题目将非常简单。设置两个指针分别指向新旧字符串首元素,遍历原字符串,当碰到空格时就在新字符串上填入“%20”,否则就复制原字符串上的内容;

2. 如果要求在原字符串上进行操作,并且保证原字符串有足够长的空间来存放替换后的字符串,如果采用从前往后替换字符串,那么保存在空格后面的字符串肯定会被覆盖,因此采用从后往前替换字符串。

1)遍历原字符串,找出字符串的长度length以及其中的空格数量blank_number;

2)根据length和blank_number计算新字符串的长度。

3)设置两个指针point1 和point2分别指向原字符串和新字符串的末尾位置,

如果point1指向的内容不为空格,那么将内容赋值给point2指向的位置;

如果point1指向的内容为空格,那么从point2开始复制“02%”;

直到point1 == point2 时表示字符串中的所有空格都已经替换完毕。

 

class Solution {

public:

    void replaceSpace(char *str,int length) {

         int str_size; //原字符串的长度

         int blankNumber = 0; //空格的数量

         for(str_size = 0;str[str_size] != '\0';str_size++){

             if(str[str_size] == ' '){

                 blankNumber++;

             }

         }

         

        int newStr_size = blankNumber * 2 + str_size;

        if (newStr_size > length){

            return ;

        }

        str[newStr_size] = '\0';

        int p1 = str_size - 1;

        int p2 = newStr_size - 1;

        while(p1 >= 0 && p1 != p2){

            if(str[p1] == ' '){

                str[p2--] = '0';

                str[p2--] ='2';

                str[p2--] = '%';

            }

            else{

                str[p2--] = str[p1];

            }

            p1--;

        }

        

    }

};

运行时间:4ms

占用内存:456K

但在这种方案里中,由于char*str 的元素是常量所以被分配在常量存储区,str为字符指针类型是存放在栈区可以被更改,而常量存取区是只读区域,不可以被更改,因此这里在牛客中定义的void replaceSpace(char* str,int length)函数中,因为定义为char* str,str中的值不可改变,所以当修改str中的值时,出现如下图所示的情况,但在牛客网上通过了,需要对C++中字符串进一步研究分析(字符串常量和字符串变量)。

 

根据《剑指offer》书中的方案,目前结果在vs2013上运行正确。

class Solution {
public:
    void replaceSpace(char str[], int length) {
        if (str == nullptr && length <= 0){
            return;
        }
        int str_size;
        int count = 0;
        for (str_size = 0; str[str_size] != '\0'; str_size++){
            if (str[str_size] == ' '){
                count++;
            }
        }
        int rst_size = str_size + 2 * count;
        if (rst_size > length){
            return;
        }
        int p1 = str_size;
        int p2 = rst_size;
        while (p1 >= 0 && p1 != p2){
            if (str[p1] == ' '){
                str[p2--] = '0';
                str[p2--] = '2';
                str[p2--] = '%';

            }
            else{
                str[p2--] = str[p1];
            }
            p1--;
        }
    }
};

更多测试代码参考github链接:

https://github.com/nihaizai/-offer/blob/master/%E9%9D%A2%E8%AF%95%E9%A2%985%EF%BC%9A%E6%9B%BF%E6%8D%A2%E7%A9%BA%E6%A0%BC/main.cpp

参考链接:

https://www.cnblogs.com/codingmengmeng/p/5857143.html

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值