剑指 Offer(第2版)面试题 5:替换空格

剑指 Offer(第2版)面试题 5:替换空格

题目来源:16. 替换空格

注意,书上的要求是原地修改字符串 str。

解法1:从前往后替换空格

代码:

class Solution
{
public:
	string replaceSpaces(string &str)
	{
		for (int i = 0; i < str.size(); i++)
			if (str[i] == ' ')
			{
				str.erase(i, 1);
				str.insert(i, "%20");
			}
		return str;
	}
};

复杂度分析:

时间复杂度:O(n2),其中 n 是字符串 str 的长度。遍历字符串要 O(n) 的时间,每次遇到空格,需要移动后面 O(n) 个字符,总的时间复杂度为 O(n2)。

空间复杂度:O(1)。

解法2:从后往前替换空格

设字符串长度为 len,遍历一次字符串 str,统计其中空格的个数,记为 space。

我们将字符串的每一个空格替换成 “%20”,替换后的字符串长度为 len + 2 * space。

我们从字符串的末尾开始复制和替换。首先准备两个指针 p1 和 p2,p1 指向原始字符串的末尾,p2 指向替换后字符串的末尾。向前移动 p1,有 2 种情况:

  • p1 == ‘ ‘,p1 前移 1 格,在 p2 之前插入字符串 “%20”,p2 前移 3 格;
  • 否则,p2 复制 p1 处的字符,p1 和 p2 都前移 1 格。

代码:

class Solution
{
public:
	string replaceSpaces(string &str)
	{
		int len = 0, space = 0;
		int i = 0;
		while (str[i] != '\0')
		{
			len++;
			if (str[i] == ' ')
				space++;
			i++;
		}
		int new_len = len + 2 * space;
		str.resize(new_len);
		int p1 = len, p2 = new_len;
		while (p1 >= 0 && p2 > p1)
		{
			if (str[p1] == ' ')
			{
				str[p2--] = '0';
				str[p2--] = '2';
				str[p2--] = '%';
			}
			else
				str[p2--] = str[p1];
			p1--;
		}
		return str;
	}
};

复杂度分析:

时间复杂度:O(n),其中 n 是字符串 str 的长度。

空间复杂度:O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

UestcXiye

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

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

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

打赏作者

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

抵扣说明:

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

余额充值