剑指Offer(二)——替换空格
题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
题解:
用的是Java,这道题有多种解法,但本质上就是减少对字符串的移动次数,正常思路下进行边搜索边字符串替换,从后往前搜索要比从前往后搜索要快。
一解:
public String replaceSpace(StringBuffer str) {
if (str != null && str.length() > 0) {
str.append(" ");
for(int i=str.length() - 2; i>=0; i--) {
if (str.charAt(i) == ' ') {
str.replace(i, i + 1, "%20");
}
}
str.deleteCharAt(str.length() - 1);
}
return str.toString();
}
这是本人解法,先对原字符串添加一个空格是应对原字符串最后一个字符为空格的情况,防止在进行替换的时候越界,原因是使用StringBuffer.replace(int start, int end, String str);
这个函数时,
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
str | W | e | A | r | e | H | a | p | p | y |
当你要替换str[2]的空格时,代码为str.replace(2,3,"%20");
那么当你要替换str[12]处的空格时,代码自然为str.replace(12,13,"%20");
但是这样就会报错,因为str[13]并没有字符,因此我选择先加上一个空格,等待替换完成之后删除添加的空格即可(也可以是其他字符)。
二解:
public String replaceSpace(StringBuffer str) {
StringBuffer resultStr = new StringBuffer("");
if (str != null && str.length() > 0) {
for(int i=0; i<str.length(); i++) {
char b = str.charAt(i);
if (b == ' ') {
resultStr.append("%20");
}else {
resultStr.append(b);
}
}
}
return resultStr.toString();
}
第二种解法的思路是定义一个新字符串,对旧字符串进行搜索,当旧字符不是空格时,对新字符串添加原字符,当旧字符是空格时,则添加指定字符串。这种解法的好处是不用担心最后一个字符是空格的情况。
三解:
public String replaceSpace(StringBuffer str) {
return str.toString().replace(" ", "%20");
}