[Lc]面试题05替换空格
Contents
题目
题解
1. 双指针法
先统计空格个数,然后扩容,然后用双指针挨个从前往后复制数据,不需要额外空间
- 时间复杂度$O(n)$,遍历两遍
- 空间复杂度$O(1)$
class Solution {//两个方法。1. 双指针法
public:
string replaceSpace(string s) {
int n = s.size();//原字符串长度
int space_num = 0;//总空格数
for(int i=0; i<n; ++i){
if(s[i] == ' ')space_num++;
}//统计空格数
int p1 = n-1, p2 = n+space_num*2-1;//双指针,指向原字符串和新字符串末尾
s.append(space_num*2,'#');//字符串扩容
while(p1>=0 && p2>p1){//当p1没到头,或者p2没追上p1(也可以p1,p2都没到头),继续向前遍历
if(s[p1] == ' '){//遇到空格,p2加上%20
s[p2--]='0';
s[p2--]='2';
s[p2--]='%';
}else{//没遇到空格,p2=p1
s[p2--]=s[p1];
}
p1--;//注意p1向前移动
}
return s;
}
};
2. 新string法
创建一个新string,从前往后遍历,遇到’ ‘就添加”%@20”,其他情况复制原char
- 时间复杂度$O(n)$,遍历一遍
- 空间复杂度$O(n)$
class Solution {//两个方法。2.新数组法
public:
string replaceSpace(string s) {
string res;
for(int i=0; i<s.size(); ++i){
if(s[i]==' ')res.append("%20");
else res.push_back(s[i]);
}
return res;
}
};
Author ChrisHRZ
LastMod 2020-05-09