题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。
例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路
一、时间复杂度为O(n^2)的方法:
本题乍一看很简单,以为一边遍历数组一边替换就行了,但是!原来空格’ '只占一个存储空间,但替换的"%20"要三个存储空间,上述方法势必需要边替换边向后移位,替换每个空格都要移动后面O(n)个字符,若字符串长度是n,则时间复杂度就是O(n^2),有点耗时,需要减少移位操作来减少时间。
二、时间复杂度为O(n)的方法:
- 先从前往后遍历,求出字符串中空格的总数spaceNum
- 从而确定替换后的新字符串的长度lengthNew(每个空格替换后比原来多了个字符,所以新长度=原长度+空格总数*2)
- 定义两个索引(类似C++里面的指针),分别指向原字符串的末尾indexOld和新字符串的末尾indexNew
- 两个索引同时从后往前移动:
若indexOld遇到了空格就用"%20"替换空格,,原索引向前移动1步,新索引向前移动3步;
若indexOld还未遇到空格,新索引就依次向前复制原字符串的内容
三、利用Java库函数的方法:
直接使用Java自带的替换函数replaceAll(“待替换字符的正则表式”,“用来替换的字符”)
空格的正则表式是:\\s
也可以把字符存储到StringBuffer中,利用StringBuffer的append()方法
实现
时间复杂度为O(n)的方法:
/*
* 法1:各种语言都适用的思路,不直接使用Java自带的替换函数replaceAll()
*/
public String replaceSpace(StringBuffer str) {
//不用排除空串情形,下面已经包括了,若没有空格就直接输出空串
int spaceNum=0; //定义字符串中空格总数
//====从前向后遍历字符串,获得空格总数====
for(int i=0;i<str.length();i++) {
if(str.charAt(i)==' ') {
++spaceNum;
}
}
int lengthOld=str.length(); //原始字符串长度
int indexOld=lengthOld-1; //指向原始字符串末尾的索引
//定义替换后的字符串长度和末尾索引
int lengthNew=lengthOld+spaceNum*2;
int indexNew=lengthNew-1;
//扩展字符串长度
str.setLength(lengthNew);
//====从后往前替换空格 ====
while(indexOld>=0 && indexNew>indexOld) {
if(str.charAt(indexOld)==' ') { //若旧索引遇到空格,从后向前用'0''2''%'替换空格
str.setCharAt(indexNew--, '0');
str.setCharAt(indexNew--, '2');
str.setCharAt(indexNew--, '%');
}
else {
str.setCharAt(indexNew--, str.charAt(indexOld));
}
--indexOld;
}
//把StringBuffer转换成String 类型
String s=str.toString();
return s;
}
利用Java库函数的方法:
/*
* 法2:直接使用Java自带的替换函数replaceAll("待替换字符的正则表式","用来替换的字符")
*/
public String replaceSpace1(StringBuffer str) {
//先把StringBuffer转换成String
String s=str.toString();
//再直接调用replaceAll函数,改变变量s的内容
s=s.replaceAll("\\s", "%20"); //空格的正则表式:\\s
return s;
}
或者把字符存储到StringBuffer中,利用StringBuffer的append()方法,遍历到空格就加入“%20”,不是空格就加入遍历到的字符
public String replaceSpace(StringBuffer str) {
//利用StringBuffer的append方法(StringBuffer是可变类)
//先创建StringBuffer对象
StringBuffer sb=new StringBuffer();
//把给的StringBuffer对象转换成String,遍历后依次放进StringBuffer对象里
String s=str.toString();
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(String.valueOf(c).equals(" ")){ //" "是String类型,所以必须先把c转换成String类型
sb.append("%20");
}
else{
sb.append(c);
}
}
return sb.toString();
}