0
点赞
收藏
分享

微信扫一扫

Spring + ECharts数据可视化

心如止水_c736 2023-07-05 阅读 84
算法

文章目录

一、题目

在这里插入图片描述

二、双指针法

  思路分析:这道题使用双指针法就能不用额外的辅助空间。首先计算字符串中的空格数量,然后重设字符串的空间。之后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

举报

相关推荐

0 条评论