题目描述
请实现一个函数,把字符串中的每个空格替换成“%20”。例如,当字符串为 “We Are Happy.”,则经过替换之后的字符串为 “We%20Are%20Happy.”。
思路
可以通过将字符串长度变长的方式去替换,即把空格占用的空间从 1 个字符变成 3 个字符。
如果有一个空格,那么就要把空格替换成 %20,替换后占用 3 个字符,而空格占 1 个字符,也就是说,字符串的长度加 2 了。
首先要先确定字符串中空格的个数,以此来确定新字符串的长度应该是多少。
经过简单计算,可得到 新字符串的长度 = 原长度 +(2 * 空格个数)。
然后定义两个指针 p1, p2 去分别指向原字符串的结尾位置以及新字符串的结尾位置。
如果 p1 指向的字符不是空格,那么将 p1 指向的字符赋值到 p2 所指向的位置,之后 p1,p2 分别向前移动一位。
如果 p2 指向的字符是空格,那么将 p2 的位置向前移动 3 个位置,并且在移动的过程中,分别赋值为 0,2,%。移动完毕后,p1 向前移动一位。
只要 p1 >= 0 并且 p1 与 p2 位置没有重合,那么就一直判断下去,直至把原字符串过一遍。
代码
public class Solution {
public String replaceSpace(StringBuffer str) {
if (str == null || str.length() <= 0) {
return "";
}
// 字符串原长度
int originalLength = str.length();
// 字符串新长度
int newLength;
// 空格个数
int numberOfBlank = 0;
// 确定空格个数
for (int i = 0; i < originalLength; i++) {
if (str.charAt(i) == ' ') {
numberOfBlank++;
}
}
// 不存在空格,返回原字符串
if (numberOfBlank == 0) {
return str.toString();
}
newLength = originalLength + (2 * numberOfBlank);
// 扩充
str.setLength(newLength);
int p1 = originalLength - 1;
int p2 = newLength - 1;
while (p1 >= 0 && p1 != p2) {
char ch = str.charAt(p1);
// 不是空格
if (ch != ' '){
str.setCharAt(p2, ch);
p2--;
} else {
str.setCharAt(p2--, '0');
str.setCharAt(p2--, '2');
str.setCharAt(p2--, '%');
}
p1--;
}
return str.toString();
}
}
来源:oschina
链接:https://my.oschina.net/Oaki/blog/3167611