【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; } };