【算法与数据结构】剑指 Offer 05、LeetCode替换空格

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解

一、题目

在这里插入图片描述

二、双指针法

  思路分析:这道题使用双指针法就能不用额外的辅助空间。首先计算字符串中的空格数量,然后重设字符串的空间。之后i指针指向新设空间的末尾,j指向旧字符串空间的末尾,碰到非空格字符的直接更新i指针内容,反之将i指针指向的前三个字符改成%20。你肯定想问为什么不从前往后填充呢?从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。

  大部分数组填充类的问题,一般都是预先给数组扩容,然后从后往前进行操作。这样的操作有两个好处:

  • 不用申请新数组。
  • 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。

  程序如下

class Solution {
public:
	// 双指针法将空格替换成%20
	string replaceSpace(string s) {
		// 计算空格数量,重设数组大小
		int count = 0;
		for (int i = 0; i < s.size(); ++i) {
			if (s[i] == ' ') count++;
		}
		if (!count) return s;	// 没有空格直接返回
		s.resize(s.size() + 2 * count);
		// 替换操作
		for (int i = s.size() - 1, j = s.size() - 2 * count - 1; i >= 0; --j,--i) {
			if (s[j] != ' ') {
				s[i] = s[j];
			}
			else {
				s[i--] = '0';
				s[i--] = '2';
				s[i] = '%';
			}
		}
		return s;
	}
};

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

三、完整代码

# include <iostream>
# include <string>
using namespace std;

class Solution {
public:
	// 双指针法将空格替换成%20
	string replaceSpace(string s) {
		// 计算空格数量,重设数组大小
		int count = 0;
		for (int i = 0; i < s.size(); ++i) {
			if (s[i] == ' ') count++;
		}
		if (!count) return s;	// 没有空格直接返回
		s.resize(s.size() + 2 * count);
		// 替换操作
		for (int i = s.size() - 1, j = s.size() - 2 * count - 1; i >= 0; --j,--i) {
			if (s[j] != ' ') {
				s[i] = s[j];
			}
			else {
				s[i--] = '0';
				s[i--] = '2';
				s[i] = '%';
			}
		}
		return s;
	}
};

int main() {
	string s = "We are happy.";
	cout << "目标字符串:" << s << endl;
	Solution s1;
	s = s1.replaceSpace(s);
	cout << "替换空格后的字符串:" << s << endl;
	system("pause");
	return 0;
}

end

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

晚安66

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

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

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

打赏作者

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

抵扣说明:

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

余额充值