76、【字符串】剑指 Offer ——05. 替换空格(C++版本)
题目描述
原题链接:剑指 Offer 05. 替换空格
解题思路
一、暴力解法
每出现一个空格,就出三个空位置,然后再填充字符。
class Solution {
public:
string replaceSpace(string s) {
int cnt = 0;
// 先统计有几个位置需要替换
for(int i = 0; i < s.size(); i++) {
// 注意这里应为' ':代表字符,而" ":代表字符串
if(s[i] == ' ') cnt++;
}
// 更新s的长度
s.resize(s.size() + cnt * 2);
int n = s.size();
for(int i = 0; i < n; i++) {
// 找到一个空位置,将后续元素移除两个位置
if(s[i] == ' ') {
// 注意边界,从i + 3到n - 1需要被移动
for(int j = n - 1; j > i + 2; j--) {
// 每次需移动两个位置
s[j] = s[j - 2];
}
// 填充字符
s[i] = '%';
s[i + 1] = '2';
s[i + 2] = '0';
}
}
return s;
}
};
时间复杂度
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度
O
(
1
)
O(1)
O(1)
二、双指针解法
从后往前依次填充。在原字符串位置末尾和新字符串位置末尾分别设置一个尾指针,当原字符串尾指针所指向的不为空格时,将该字符填充到新字符串尾指针所指向位置。当指向为空格时,在新字符串尾指针的开始处并再往前两个位置填充%20
。当遍历到i == j
时,说明空位置已被替换完,剩下的为非空位置或全遍历完。
class Solution {
public:
string replaceSpace(string s) {
int n1 = s.size();
int cnt = 0;
for(int i = 0; i < n1; i++) {
if(s[i] == ' ') cnt++;
}
s.resize(n1 + cnt * 2);
int n2 = s.size();
for(int i = n1 - 1, j = n2 - 1; i < j; i--, j--) { // 当i == j时,说明空位置已被替换完,剩下的为非空位置或全遍历完
if(s[i] == ' ') {
s[j--] = '0';
s[j--] = '2';
s[j] = '%'; // 每次结束后会有自动地j--,此处不需要再j--
} else {
s[j] = s[i];
}
}
return s;
}
};
时间复杂度
O
(
n
)
O(n)
O(n)
空间复杂度
O
(
1
)
O(1)
O(1)
参考文章:题目:剑指Offer 05.替换空格
相关文章
- C++常用字符串分割方法
- C++ 获取系统文件夹路径
- NYOJ 113 字符串替换(C++STL解法)
- C++整數和IP字符串轉換
- 84 C++ - 内建函数对象
- C++的Opencv动态库遇到的问题
- C/C++由字符串转JSON/JSON转字符串/数组解析/数组添加
- C++ 创建文件夹的四种方式
- [C++]:万字超详细讲解多态以及多态的实现原理(面试的必考的c++考点)
- C++学习相关
- 《C++编程规范:101条规则、准则与最佳实践》——2.8懂得何时和如何进行并发性编程
- 《C++编程风格(修订版)》——2.2 明确定义的状态
- 《C和C++代码精粹》——2.9 字符串数组
- 基于C++实现的(控制台)员工工资管理系统【100010691】
- 基于QT(C++)实现B树可视化【100010518】
- 基于C++语言+VS2017+Openssl实验【100010446】
- 理清gcc、libc、libstdc++的关系(libstdc++是gcc搞的,libc++是llvm搞的,他们都是C++标准库的实现)
- 使你的C/C++代码支持Unicode(CRT字符串处理的所有API列表,甚至有WEOF字符存在)
- 漫话C++之string字符串类的使用(有汇编分析)
- C++ | (struct)结构体变量作为函数参数调用的方法小结
- C++11 数值类型和字符串的相互转换
- 41、【匹配算法】KMP字符串匹配算法(C/C++版)
- 【C/C++】C语言复制字符串及复制函数汇总(strcpy()/memcpy()/strncpy()/memmove())
- C++如何输入含空格的字符串