前言
一、问题描述
请实现一个函数,把字符串 s 中的每个空格替换成 “%20”
示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”
注意:0 <= 字符串的长度 <= 10000
二、solution
1.C++特性法
代码如下:
class Solution {
public:
string replaceSpace(string s) { //字符数组
string array; //存储结果
for(auto &c : s){ //遍历原字符串
if(c == ' '){
array.push_back('%');
array.push_back('2');
array.push_back('0');
}
else{
array.push_back(c);
}
}
return array;
}
};
2.双指针法
代码如下:
class Solution {
public:
string replaceSpace(string s) {
int count = 0; // 统计空格的个数
int sOldSize = s.size();
for (int i = 0; i < s.size(); i++) {
if (s[i] == ' ') {
count++;
}
}
// 扩充字符串s的大小,也就是每个空格替换成"%20"之后的大小
s.resize(s.size() + count * 2);
int sNewSize = s.size();
// 从后先前将空格替换为"%20"
for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {
if (s[j] != ' ') {
s[i] = s[j];
} else {
s[i] = '0';
s[i - 1] = '2';
s[i - 2] = '%';
i -= 2;
}
}
return s;
}
};
时间复杂度:O(n)
空间复杂度:O(1)
3.静态数组
3.1 速度快,空间占用多
public String replaceSpace(String s) {
int n = s.length();
char[] newArr = new char[3 * n];
int j = 0;
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
if (c == ' ') {
newArr[j++] = '%';
newArr[j++] = '2';
newArr[j++] = '0';
} else {
newArr[j++] = c;
}
}
return new String(newArr, 0, j);
}
3.2 性能损耗多,空间少
public String replaceSpace(String s) {
int n = s.length();
int cnt = 0;
for (char c : s.toCharArray()) {
if (c == ' ') cnt++;
}
char[] newArr = new char[n + 2 * cnt];
int j = 0;
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
if (c == ' ') {
newArr[j++] = '%';
newArr[j++] = '2';
newArr[j++] = '0';
} else {
newArr[j++] = c;
}
}
return new String(newArr);
}
以上代码的复杂度分析如下:
空间复杂度都是 O(n)
时间复杂度都是 O(n)