您的位置:首页 > 其它

算法题目--替换空格

2017-06-23 22:34 197 查看
题目内容:



此题有三种做法:

(1)使用java的replace方法

(2)使用一个额外的字符串做辅助

(3)在原字符串上修改

这三种做法的难度依次上升。

我主要来分析一下第三种做法,也是O(n)的一个做法。

第三种方法的思路:

先遍历一遍字符串,这样就能统计出字符串中空格的总数,并可以由此计算出替换之后的字符串长度。

每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2*空格的数目。

我们从字符串的后面开始复制和替换,首先准备两个指针,P1和P2,P1指向原始字符串的末尾,P2指向替换之后字符串的末尾。

接下来,向前移动指针P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格。

三种方法的实现算法如下:

package test01;

public class test02 {
public static void main(String[] args) {
StringBuffer str = new StringBuffer();
str.append("hello world");
System.out.println(replaceSpaceFun1(str));
System.out.println(replaceSpaceFun2(str));
System.out.println(replaceSpace(str));
}
//使用replace方法
public static String replaceSpaceFun1(StringBuffer str) {
return str.toString().replaceAll(" ", "%20");
}
//新建另外一个字符串
public static String replaceSpaceFun2(StringBuffer str) {
StringBuffer out=new StringBuffer();
for(int i=0;i<str.length();i++){
if(str.charAt(i)==' '){
out.append("%20");
}else{
out.append(str.charAt(i));
}
}
return out.toString();
}
//不新建字符串,在本身上修改
public static String replaceSpace(StringBuffer str) {
int originalLength=str.length();
int blankNum=0;
for (int i = 0; i < originalLength; i++) {
if(str.charAt(i)==' '){
blankNum++;
}
}
int newLength=originalLength+2*blankNum;
int indexOriginal=originalLength-1;
int indexNew=newLength-1;
//将str的长度扩展为变为%20后的长度值
str.setLength(newLength);
while(indexNew>indexOriginal&&indexOriginal>=0){
if(str.charAt(indexOriginal)==' '){
str.setCharAt(indexNew--, '0');
str.setCharAt(indexNew--, '2');
str.setCharAt(indexNew--, '%');
}else{
str.setCharAt(indexNew--, str.charAt(indexOriginal));
}
--indexOriginal;
}
return str.toString();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: