0、前言
题目来源 leetcode
在网络编程中,如果URL参数中含有特殊字符,如空格、’#‘等,则可以能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在’%‘后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成"%20"。再比如’#'的ASCII码为35,即十六进制的0x23,它在URL中被替换为"%23"。
摘自 《剑指Offer》51页
1、题目描述
2、解题思路
- 普通的思路
传统解法为双重for循环,从前向后遍历依次填充,每次将空格填充为"%20"。因为一个字符变三个字符,所以需要将后面的字符依次向后移动两位。
时间复杂度 O ( n 2 ) O( \ n^2) O( n2),不足以拿到offer
- 正确的思路
3、代码示例
(1)C语言
- 验证我们解题思路,轮子我们自己来造。
char* replaceSpace(char* s) {
// 计算p1和p2指针位置
int p1 = 0, p2 = 0;
for (int j = 0; s[j]; j++) {
p2 += (s[j] == ' ' ? 3 : 1);
p1++;
}
// 增加空间
s = (char *)realloc(s, sizeof(char) * (p2 + 5));
// 处理字符串
while (p1 >= 0) {
if (s[p1] != ' ') {
s[p2--] = s[p1--];
} else {
s[p2--] = '0';
s[p2--] = '2';
s[p2--] = '%';
p1--;
}
}
return s;
}
(2)C++
- 不要将s.size()写在for循环的外面,每将一个空格转换为"%20"都会让字符串长度增加两位。
- replace()的意思:从第i位开始替换,替换长度为1(空格字符长度为1),替换字符串为"%20"。
class Solution {
public:
string replaceSpace(string s) {
for(int i = 0; i < s.size(); i++) {
if(s[i] == ' ') {
s.replace(i, 1, "%20");
}
}
return s;
}
};
3、Python
- Python、Java、Kotlion同理
- replace()方法:将空格替换为字符串’%20’
class Solution:
def replaceSpace(self, s: str) -> str:
return s.replace(' ', '%20')