题目
替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"
示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”
思路1
- 统计字符数组中空格的个数
- 开辟一个新数组,长度为原字符串长度+2*空格数
- 拷贝原字符到新字符数组中
时间复杂度O(n) 空间复杂度O(n)
public static String replaceSpace1(String s) {
char[] chars = s.toCharArray();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < chars.length; i++) {
if (chars[i] != ' '){
sb.append(chars[i]);
} else {
sb.append("%20");
}
}
return sb.toString();
}
public static String replaceSpace2(String s) {
char[] chars = s.toCharArray();
int length = chars.length;
int num = 0;
for (int i = 0; i < length; i++) {
if (chars[i] == ' '){
num++;
}
}
int k = 0;
char[] chars1 = new char[length + num * 2];
for (int i = 0; i < chars.length; i++){
if (chars[i] != ' '){
chars1[k] = chars[i];
k++;
} else {
chars1[k++] = '%';
chars1[k++] = '2';
chars1[k++] = '0';
}
}
return new String(chars1);
}
思路2
- 统计字符数组中空格的个数
- 开辟一个新数组,长度为原字符串长度+2*空格数
- 定义指针p1和 p2 分别指向原数组和新数组的末尾
- 遍历两个数组,若碰到空格,p1向前移动1位,新数组插入%20,p2向前移动3位
- 若不是空格,逐个把p1碰到的字符拷贝到p2,p1和p2都向前移动一位
时间复杂度O(n) 空间复杂度O(n)
/**
* 双指针的解法
*/
public static String replaceSpace3(String s) {
char[] oChar = s.toCharArray();
int emptySize = 0;//空格数
for (int i = 0; i < oChar.length; i++) {
if (oChar[i] == ' '){
emptySize++;
}
}
char[] nChar = new char[oChar.length + emptySize * 2];//开辟一个新数组
int p1 = oChar.length - 1;//指针p1指向原数组的末尾
int p2 = nChar.length - 1;//指针p2指向新数组的末尾
while (p1 >= 0 && p2 >= 0){
char o1 = oChar[p1];
if (o1 == ' '){ //若碰到空格,p1向前移动1位,新数组插入%20,p2向前移动3位
nChar[p2] = '0';
nChar[p2 - 1] = '2';
nChar[p2 - 2] = '%';
p1 -= 1;
p2 -= 3;
} else { //若不是空格,逐个把p1碰到的字符拷贝到p2,p1和p2都向前移动一位
nChar[p2] = o1;
p1 -= 1;
p2 -= 1;
}
}
return String.valueOf(nChar);
}