题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
分析
这个题看起来是很容易做的,就是简单的替换.但当你仔细分析后,就会有一个问题出现,当字符串特别长的时候,应该怎样优化自己的算法呢 ?
一般常规的做法是:从前向后遍历字符串,当遇到空格时,把空格用"%20",但是空格后面的字符都要向后移动一位(因为%20比空格长),后面的每个替换操作都需要后面的字符向后移动.这样算法的复杂度就大大增加了.
换一种思路,当你从字符串的最后遍历-替换的话,是不是就没有这个问题了呢?
答案是肯定的,但是需要你提前计算好替换后的字符串的长度,不然就会出现字符串长度溢出(这里默认的是定长的字符类型String,.我下面的代码里面用的是可变的Stringbuffer).从后向前的操作和从前向后的操作一样,只是遍历的方向不同而已,下面看下具体代码实现吧!
源代码 (用java类库函数)
/**
* 请实现一个函数,将一个字符串中的每个空格替换成“%20”。
* 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
*/
public class Dome4 {
public static void main(String[]args){
Dome4 dome4=new Dome4();
StringBuffer buffer=new StringBuffer("we are happy");
System.out.println(dome4.replaceSpace(buffer));
}
/**
*
*
* @param str 替换前的字符串
* @return 替换后的字符串
*/
public String replaceSpace(StringBuffer str) {
for(int i=str.length()-1;i>=0;i--){
if(Character.isSpaceChar(str.charAt(i))){//判断空格位置
str.replace(i,i+1,"%20"); //替换空格
}
}
String result= String.valueOf(str);
return result;
}
}
不用类库
public class Dome4_1 {
public static void main(String[]args){
replaceSpace();
}
public static void replaceSpace(){
String str="we are happy";
char []ch=str.toCharArray();
int newLen=ch.length+2*2;//指向修改后数组末尾
int b=ch.length-1;//原始字符串的长度
char []newCh=new char[newLen+1];
while (b>=0&&newLen>=b){
if(Character.isSpaceChar(ch[b])){
newCh[newLen--]='0';
newCh[newLen--]='2';
newCh[newLen--]='%';
}else{
if(newLen==ch.length+2*2){//为了防止数组溢出
--newLen;
}
newCh[newLen--]=ch[b];
}
b--;
}
for(int i=0;i<newCh.length-1;i++){
System.out.print(newCh[i]);
}
}
}