C/C++ 替换空格解法二:双指针解法 图解双指针【简单易懂,代码可以直接运行】
题目描述:
请实现一个函数,把字符串中的每个空格替换成"%20"。
你可以假定输入字符串的长度最大是 1000。
注意输出字符串的长度可能大于 1000。
样例
输入:“We are happy.”
输出:“We%20are%20happy.”
1.这道题省空间可以使用双指针算法。先遍历字符串找到空格的位置,并再遍历过程设置长度计数,当遍历到空格的时候,将长度+3,否则长度+1。计算出来替换空格之后字符串的长度len。
2.设置双指针i,j。将i定位到字符串最后一个位置,将j定位到替换空格后字符串的最后一个位置len-1。
3.将数组长度通过resize函数重新设置为len长度。然后i从最后一个元素开始倒序遍历。j同样从字符串最后一个位置开始倒序遍历。使用while循环while(i >= 0)
4.如果遍历过程中遇到空格则,使用三个j–来存放需要进行替换的字符。否则直接赋值str[j] = str[i]
需要注意的是:
为什么要倒着循环:
因为j再循环过程中一直比i大,这样再检测到空格时,在j位置进行赋值时并不会影响到i为遍历的部分。但是正向循环却不一样。会修改到i为遍历到的位置。出错!!!
图解倒序遍历如下:
**
**
是不是一目了然,双指针的遍历应用真的十分广泛!!
代码如下:
#include<iostream>
#include<typeinfo>
using namespace std;
int main()
{
string s;
int len;
len = 0;
getline(cin,s);
for(auto c : s)
{
if(c == ' ') len += 3;
else len += 1;
}
int i = s.length() - 1;
int j = len - 1;//倒着输出i,j是一直大于i的,所以这就保证了j不回去遮盖住i没有遍历到的值。如果正着输出j会遮盖住i
s.resize(len);
while(i >= 0)
{
if(s[i] == ' ')
{
s[j--] = '0';
// j -= 1;
s[j--] = '2';
s[j--] = '%';
}
else s[j] = s[i];
i -= 1;
// j -= 1;//不能写在下面,这道题是先进行的赋值操作,后来进行的--操作,也就是现在该位置上进行赋值操作
}
for(j = 0;j < len;j++)
{
cout<<s[j];
}
return 0;
}
点个👍吧,秋梨膏!!