C/C++ 替换空格解法一:双指针解法 图解双指针【简单易懂,代码可以直接运行】

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

点个👍吧,秋梨膏!!
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

henu-于笨笨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值