面试题5:替换空格
题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
需要注意的是:空格是一个字符,%20是3个字符,直接替换会导致后面的字符被覆盖
思路1:
创建一个新的字符串变量,遍历源字符串,当遇到空格时,将%20加到新字符串,当不是空格时,直接把字符加到字符串。
时间复杂度为O(n),空间复杂度为O(n),此方法以空间来换时间
public class Solution {
public String replaceSpace(StringBuffer str) {
if(str==null||str.length()==0)
return str.toString();
String replace ="";
for(int i=0;i<str.length();i++){
if(str.charAt(i)==' ')
replace+="%20";
else
replace+=str.charAt(i);
}
return replace;
}
}
思路二
从头到尾扫描字符串,当遇到空格后的字符都都后移两个单位,然后把一个空格字符替换成3个字符“%20”,这种方法的时间复杂度为O(n²),空间复杂度为O(1)。
我们发现每遇到一次空格就移动一次位置,那么很多字符都移动了多次位置,那么我们如何减少移动次数
换一种思路,把从前向后替换改为从后向前替换
先遍历一次字符串,统计出空格的数量,那么就知道了替换之后字符串的总长度
public class Solution {
public String replaceSpace(StringBuffer str) {
int length=str.length();
if(str==null||length==0)
return str.toString();
int newLength=0;
for(int i=0;i<length;i++){
if(str.charAt(i)==' ')
newLength++;
}
if(newLength==0)//没有空格
return str.toString();
newLength=newLength*2+length;
str.setLength(newLength);
int newIndex=newLength-1;
for(int i=length-1;i>=0;i--){
if(str.charAt(i)==' '){
str.setCharAt(newIndex--,'0');
str.setCharAt(newIndex--,'2');
str.setCharAt(newIndex--,'%');
}
else
str.setCharAt(newIndex--,str.charAt(i));
}
return str.toString();
}
}
该算法时间复杂度为O(n),空间复杂度为O(1)
需要注意的是String数组是不可改动其中的元素的,所以使用java.lang.StringBuffer中的setLength(字符串长度)来改变字符串的长度,使用setCharAt(索引位置,新的字符)来改变某一位置的字符