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

任务:

思路:

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

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

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

提交结果:

经验分享 程序员 微信小程序 职场和发展