【c++牛客网刷题】- 02替换空格

博客围绕字符串空格替换任务展开,因有空间限制不能正向替换,避免越界问题。提出从后往前替换的思路,先遍历原始字符串确定长度和空格数,进而确定新字符串长度,设置指针反向遍历,根据指针指向内容进行赋值操作,最后给出代码和提交结果。
任务:

在这里插入图片描述

思路:

(1)首先说明,从正向插入的话,遍历一遍,将长度为1的空格替换为长度为3的%20, 字符串的长度会变长,所以题目允许我们开辟新的数组来进行存放替换后的字符串的话,那是肯定没得问题的,而且问题也就变得很简单:

Step1:设置两个指针分别指向新旧字符串的首元素;
Step2:遍历原字符串,如果遇到空格,就在新字符串相应位置填入%20;
Step3:如果没有遇到空格,就把原字符串上的内容复制到新字符串上。

但是!!!凡事都有但是,面试当然应该没有这么简单,对,本题有了空间的限制,所以就不能正向,很难避免越界问题;
(2)那么该怎么办呢?我们需要在原字符串上进行操作,我们需要保证原字符串有足够长的空间来存放替换后的字符串,所以,从前往后的话,保存在空格后面的字符串肯定会被覆盖,因为是字符数组!
所以按照下面的方法来:
(3)从后往前进行替换:
a)首先遍历原始字符串,找出字符串的长度以及其中空格的数量;
b)根据原字符串的长度以及空格的数目就可以确定新字符串的长度,可以提前进行判断!
c)设置两个指针p1p2分别指向原字符串和新字符串的末尾(指向末尾才能反向遍历)
d)进行判断,
如果·p1·指向内容不是空格,就吧内容赋值给p2指向的位置
如果p1指向空格,就从p2的位置开始赋值02%
e)一直到p1p2相遇,这个时候同时p1还没减过头
大概就是怎么一个思路:

代码如下:
class Solution {
public:
	void replaceSpace(char *str,int length) {
        // 检查边界条件,看str是非为空,长度是非有效
        if(str==NULL||length<0)
            return ;
        // 初始化变量
        int numOfBlanks = 0;     // 给定字符数组中空格的数目的初始化
        int oldLength = 0;       // 给定字符数组的长度的舒适化
        int i = 0;               // 给定字符数组的索引变量
        // 遍历一遍str,得到原来字符数组中的个数,以及空格数
        while(str[i] != '\0'){   // \0表示的是一个字符串的结束
            oldLength++;
            if(str[i] == ' ')
                numOfBlanks++;
            i++;
        }
        
        int newLength = oldLength + 2 * numOfBlanks;  // 根据空格数目预算好新的字符串的长度
        // 第二次边界检查,如果新的字符串的长度大于给定的界限(也就是这里的空间限制),那么就直接返回!
        if (newLength>length)
            return;
        
        int p1 = oldLength;
        int p2 = newLength;
        // 替换结束的条件,p1走到了0且p2的长度还是比p1大
        while(p1>=0 && p2 > p1){
            if(str[p1]==' ')
            {
                str[p2--] = '0';
                str[p2--] = '2';
                str[p2--] = '%';
            }
            else{
                str[p2--] = str[p1];
            }
            p1--;
        }
        return;
	}
};
提交结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值