题目描述
剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
题目背景
在网络编程中,如果URL的参数中有特殊字符,比如空格或者“ # ”等,则可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在“%”之后跟上ASCII码的两位十六进制表示。
我的方法
正向循环字符串,如果遇到空格则append“%20”,如果不是空格就append字符串中的字符。
代码如下:
class Solution {
public String replaceSpace(String s) {
StringBuffer sb = new StringBuffer();
char[] schar = s.toCharArray();
for(int i = 0;i<schar.length;i++){
if(schar[i] == ' '){
sb.append("%20");
}else{
sb.append(schar[i]);
}
}
return sb.toString();
}
}
这个方法首先要知道toCharArray的复杂度,我们看一下toCharArray的源码“
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
char result[] = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}
我们发现时间复杂度应该是O(n),空间复杂度应该也是O(n)
所以上面这个方法总的时间复杂度应该是O(n),空间复杂度也是O(n)。
解决方法2
这是官方给出的方法:
它的思想是,如果出现了空格,那么代表着一个字符的空格会被替换成3个字符的”%20“,所以最终得到的字符串最多是原有字符串长度的3倍,之后循环字符串,根据是否为空格实现字符数组的填充,代码如下:
class Solution {
public String replaceSpace(String s) {
int length = s.length();
char[] array = new char[length * 3];
int size = 0;
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
if (c == ' ') {
array[size++] = '%';
array[size++] = '2';
array[size++] = '0';
} else {
array[size++] = c;
}
}
String newStr = new String(array, 0, size);
return newStr;
}
}
链接:原文地址
复杂度分析:
- 时间复杂度:O(n)。遍历字符串 s 一遍。
- 空间复杂度:O(n)。额外创建字符数组,长度为 s 的长度的 3 倍。
虽然看上去都是O(n),但是感觉我的方法算法时间上会慢一点…
解决方法2
这个方法是在看评论的时候发现的,代码:
class Solution {
public String replaceSpace(String s) {
return s.replace(" ","%20");
}
}
不知道面试中能不能直接这样写,但是真好用啊!