题目描述:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
解法一:replaceAll()
public class Solution {
public String replaceSpace(StringBuffer str) {
return str.toString().replaceAll("\\s", "%20");
}
}
运行时间:22ms
占用内存:9552k
这种方法十分简单,只需要一行代码。但是本题考查的并不是该函数的用法,所以还需要再想出一个解法。
解法二:新建字符串缓存
public class Solution {
public String replaceSpace(StringBuffer str) {
StringBuffer sb = new StringBuffer();
char[] charArray = str.toString().toCharArray();
for(int i = 0; i < charArray.length; i++) {
if(charArray[i] == ' ') {
sb.append("%20");
}
else {
sb.append(charArray[i]);
}
}
return sb.toString();
}
}
运行时间:22ms
占用内存:9424k
与解法一的运行时间和占用内存极为相似,底层实现应该相同。
解法三:setCharAt()
public class Solution {
public String replaceSpace(StringBuffer str) {
int spaceNum = 0;
for(int i = 0; i < str.length(); i++) {
if(str.charAt(i) == ' ') {
spaceNum++;
}
}
int long_origin = str.length();
int long_present = long_origin + spaceNum * 2;
str.setLength(long_present);
while(long_origin >= 0 && long_origin < long_present) {
char c = str.charAt(--long_origin);
if(c == ' ') {
str.setCharAt(--long_present, '0');
str.setCharAt(--long_present, '2');
str.setCharAt(--long_present, '%');
}
else {
str.setCharAt(--long_present, c);
}
}
return str.toString();
}
}
运行时间:20ms
占用内存:9652k
首先利用空格个数算出扩容后字符序列的大小,然后用新旧长度两个指针分别向前移动,新指针存入新字符,旧指针获得原字符并进行相应处理。
方法总结:
String.toCharArray()将字符串以字符数组的形式返回
StringBuffer.setLength(int i)重新设置字符序列的长度为i
StringBuffer.setCharAt(int index, char ch)修改字符序列指定索引index处的字符为ch