题目
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
分析
最容易想到的就是从头开始遍历字符串,遇到空格,就把空格后面的内容后移两位,并插入%20.由于会重复的移动,所以时间复杂度是O(n2)
如果我们从后面开始遍历呢?先计算出字符串中的空格,知道最终字符串的长度,然后设置两个指针,一个指针p2指向新字符串的最后一位,p1指向旧 字符串的最后一位,如果p1指向的不为空格,就将p1拷贝到p2,如果是空格,就进行插入。
具体过程如下图:
这样,确定空格数的时候遍历了一次数组,移动的时候也只会移动一次,所以时间复杂度是O(n).
####代码
public class Solution {
public String replaceSpace(StringBuffer str) {
if (str == null) {
return null;
}
// 字符串转化为数组
String originalStr = str.toString();
char [] originalChars = originalStr.toCharArray();
// 遍历数组,检查数组有多少个空格
int countOfSpace = 0;
for(int i = 0; i < originalChars.length; i++){
if (originalChars[i] == ' ') {
countOfSpace ++;
}
}
// 计算原数组和新数组的长度
int originalArrLength = originalChars.length;
int newArrLength = originalArrLength + countOfSpace * 2;
char [] newArr = new char[newArrLength];
// 将原始数组拷贝到新数组
System.arraycopy(originalChars, 0, newArr, 0, originalArrLength);
// 两个指针,p2指向替换之后字符串的末尾,p1指向源字符串的末尾
int p1 = originalArrLength - 1;
int p2 = newArrLength - 1;
while(p1>=0 && p1 != p2){
if (newArr[p1]==' ') {
newArr[p2--] = '0';
newArr[p2--] = '2';
newArr[p2--]= '%';
}else{
newArr[p2--] = newArr[p1];
}
p1--;
}
String resltStr = String.valueOf(newArr);
return resltStr.toString();
}
}