题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
方法一:使用Java的字符串中的replace方法
这个方法相对于比较简单,只是直接运用java中原有的replace方法,将字符串中的每一个空格都替换成指定的子字符串,代码如下:
public class Solution {
public String replaceSpace(StringBuffer str) {
return str.toString().replace(" ", "%20");
}
}
方法二:使用双指针来改变原字符串
1.首先计算出原有的字符串中空格的个数
int spacenum=0;
for(int i=0;i<str.length();i++) {
if(str.charAt(i)==' ') {
spacenum++;
}
}
2.计算出原字符串的长度和将空格替换后的字符串长度
int oldlength=str.length();
int newlength=oldlength+spacenum*2;
3.使用setlength方法改变字符串长度(新字符串长度)
str.setLength(newlength);
4.定义两个指针,一个指向原来的字符串的末尾(indexoldstr),一个指向新字符串的末尾(indexnewstr)。
int indexoldstr=oldlength-1;
int indexnewstr=newlength-1;
5.从旧的字符串对应的indexoldstr指针开始判断,如果对应的子字符不为空格,则直接把相对应的值赋予给指针indexnewstr指向的子字符;反之则把空格替换成“%20”。接着两个指针都向前移动,继续判断。
while(indexnewstr>0&&indexoldstr<indexnewstr) {
if(str.charAt(indexoldstr)==' ') {
str.setCharAt(indexnewstr--, '0');
str.setCharAt(indexnewstr--, '2');
str.setCharAt(indexnewstr--, '%');
}
else {
str.setCharAt(indexnewstr--, str.charAt(indexoldstr));
}
indexoldstr--;
}
在上面的这个循环中,因为新字符串长度大于旧的字符串长度,所以如果有空格的话,indexnewstr的值一定是大于indexoldstr的值的,所以当indexoldstr>=indexnewstr时修改完成,跳出循环。
完整代码如下:
public String replacespace(StringBuffer str) {
int spacenum=0;
for(int i=0;i<str.length();i++) {
if(str.charAt(i)==' ') {
spacenum++;
}
}
int oldlength=str.length();
int newlength=oldlength+spacenum*2;
str.setLength(newlength);
int indexoldstr=oldlength-1;
int indexnewstr=newlength-1;
while(indexnewstr>0&&indexoldstr<indexnewstr) {
if(str.charAt(indexoldstr)==' ') {
str.setCharAt(indexnewstr--, '0');
str.setCharAt(indexnewstr--, '2');
str.setCharAt(indexnewstr--, '%');
}
else {
str.setCharAt(indexnewstr--, str.charAt(indexoldstr));
}
indexoldstr--;
}
return str.toString();
}