题目
URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)
示例 1:
输入:"Mr John Smith ", 13
输出:“Mr%20John%20Smith”
示例 2:
输入:" “, 5
输出:”%20%20%20%20%20"
提示:
字符串长度在 [0, 500000] 范围内。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-to-url-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
简化
输入
- 字符数组
- 提供真实长度
- 已经实现将尾部空间预留足够
要求:
- 替换空格为%20
输出:
- 替换后的字符串
思路
题目说明,希望我们使用字符数组,从而可以直接原地替换。所以我干脆就直接把输入改成了字符数组。
众所周知,数组要新增元素,需要进行搬移,我们现在是想要将原本为空格的1个字符改为%20三个字符,所以相当于新增了2个元素,就需要搬移了。
从前面搬移,显然比较麻烦,所以可以考虑从后面搬移。
那么思路就是
双指针
A指针从字符串尾部开始向前
B指针开始从尾部搬移A指针指到的字符。
如果A指针碰到空格,那么A指针不动,B指针向前3个,使用替换字符串,之后正常执行。
坑:可能预留的空间比所需要的空间多,需要注意处理
代码
public String replaceSpaces(String s, int length) {
if (length == 0) {
return s;
}
int posA = length - 1;
char[] chars = s.toCharArray();
int posB = s.length() - 1;
while (posA >= 0) {
if (chars[posA] != ' ') {
chars[posB] = chars[posA];
posB -= 1;
} else {
chars[posB] = '0';
chars[posB - 1] = '2';
chars[posB - 2] = '%';
posB -= 3;
}
posA -= 1;
}
int startPos = posB + 1;
// String(char[] value, int offset, int count)
return new String(chars, startPos, s.length() - startPos);
}