题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
对于字符串的替换,最容易想到的是使用str的库函数replaceAll或者replace函数,
class Solution { public String replaceSpace(String s) { return s.replaceAll(" ","%20"); } }
如果不考虑额外占用空间的话,可以使用如下方法,利用StringBuffer或者stringBuilder,避免了利用String进行拼接操作造成的内存的浪费
class Solution {
public String replaceSpace(String s) {
StringBuffer str = new StringBuffer(s);
for(int i=0;i<str.length();i++){
if(str.charAt(i)==' '){
str.deleteCharAt(i);
str.insert(i,'%');
str.insert(++i,'2');
str.insert(++i,'0');
}
}
return str.toString();
}
}
上诉方法都太过简单,没有用到算法知识,剑指offer上提供了从后向前的一个思路:
首先,最容易想到的方法是,遇到空格,则将其后面的每个字符依次向后移动两位,然后插入%20三个字符,但是这是时间复杂度为O(n^2)的方法,如何在O(n)的时间复杂度的情况下实现该算法?
我们先计算原来字符串的长度以及空格的个数,那么替换后的字符串长度即为原来字符串长度+空格个数*2
然后我们设置两个指针p1和p2,p1指向原来字符串的末尾,p2指向替换后字符串的末尾,从后往前扫描,如果p1所指位置不是空格,则将其值赋给p2所指位置,否则,在p2处移动3字符并插入%20.。p1每次向前移动一字符,直到达到字符串开头。
class Solution { public: void replaceSpace(char *str,int length) { int i = 0; int blankNumber = 0; int originalLength = 0; while(str[i] != '\0'){ originalLength++; if(str[i] == ' ') blankNumber++; i++; } int updateLength = originalLength + 2*blankNumber; if(updateLength > length) return; for(i=originalLength;i>=0;i--){ if(str[i]!=' '){ str[updateLength--] = str[i]; }else{ str[updateLength--] = '0'; str[updateLength--] = '2'; str[updateLength--] = '%'; } } } };
从后往前的思想非常巧妙,需要在今后多加注意