题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”
应用:在网络编程中,如果URL参数中含有特殊字符,如空格,‘#’等,可能导致服务器端无法获得正确的参数值。需要将特殊符号转换成服务器可以识别的字符。转换规则是在“%”后面跟上ASCII码的两位十六进制的表。比如:空格的ASCII玛是32,即十六进制的0x20,因此空格被替换成“%20”。
考虑时间复杂度为O(n)的解法,搞定offer就靠它了
1、考虑在原来的字符串上做替换:
算法描述如下:
从字符串的后面开始复制和替换,首先准备两个指针,p1和p2,p1指向原始字符串的末尾,p2指向替换后字符串的末尾,接下来,向前移动指针p1,逐个把它指向的字符复制到p2,碰到一个空格之后,把p1向前移动1格,在p2处插入字符串“20%”,由于“20%”长度为3,同时也要把p2向前移动3格。直到p1=p2,表明所有空格都已经替换完毕。
public void replaceBlank(String str,int length){
if(str == null||str.length() <= 0||length <= 0)
return;
char[] string = new char[length];
//数组间的复制
System.arraycopy(str.toCharArray(),0,string,0,str.length());
/*numberOfBlank为空格的数目*/
int numberOfBlank = 0;
for(int i = 0;i<str.length();i++){
if(string[i]==' ')
++numberOfBlank;
}
/*newLength为把空格替换成“%20”之后的长度*/
int newLength = str.length()+numberOfBlank*2;
if(newLength > length)
return;
int indexOfOriginal = str.length()-1;
int indexOfNew = newLength-1;
while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal){
if(string[indexOfOriginal]==' '){
string[indexOfNew--]='0';
string[indexOfNew--]='2';
string[indexOfNew--]='%';
}else
string[indexOfNew--] = string[indexOfOriginal];
-- indexOfOriginal;
}
System.out.println(new String(string));
}
2、创建新的字符串并在新的字符串上替换
这个比较简单,但需要用到StringBuilder对象。
public void spaceRepNew(String str){
if(str == null||str.length()<=0)
return;
StringBuilder text = new StringBuilder(str);
StringBuilder newStr = new StringBuilder();
for(int i = 0;i<text.length();i++){
if(text.charAt(i)==' ')
newStr.append("%20");
else
newStr.append(text.charAt(i));
}
System.out.println(newStr.toString());
}