背景知识:在网络编程哪个,如果URL参数中含有特殊字符,则可能导致服务器端无法获得正确的参数值。因此需要转换字符,而规则是在'%'后面加上ASCII码的两位十六进制表示,因此空格的替换就是%20
思路1:
显然一个空格字符变成了'%''2''0'三个字符,因此原来的字符串会变长。因此这里有思路0:从头到尾扫描,碰见空格就替换,然后对后面的字符都后移,这样的时间复杂度是O(n^2),所以思路1对0进行改进。
那就是先遍历一次字符串,这样就能统计出空格数,而替换时,从字符串后面移动,这样所有非空格字符串都只移动了一次。这样复杂度就变成了O(n)
那么先考虑将原字符串的长度改变,然后移动。当从后面往前面添加,需要两个变量(指针),一个记录新长度的原字符串更新处的索引,一个记录原长度字符串即将更新的字符串。
//java的StringBuffer是长度可变的
public class Solution {
public String replaceSpace(StringBuffer str) {
int count = 0;
for(int i = 0; i < str.length(); i++){
if(str.charAt(i) == ' '){
count++;
}
}
int oldLength = str.length();
int oldIndex = oldLength - 1;
int newLength = oldLength + count * 2;
str.setLength(newLength);
int newIndex = newLength - 1;
for(; oldIndex >= 0 && oldLength < newLength; oldIndex--){
if(str.charAt(oldIndex) == ' '){
str.setCharAt(newIndex--, '0');
str.setCharAt(newIndex--, '2');
str.setCharAt(newIndex--, '%');
}else{
str.setCharAt(newIndex--, str.charAt(oldIndex));
}
}
return str.toString();
}
}思路2:
开辟一个新的字符串做替换。思想和思路1大部分相同,统计空格次数,然后也是从后一个个添加。
而思路1的指向新长度的原字符串的指针,变成指向了新字符串的指针。
public class Solution {
public String replaceSpace(StringBuffer str) {
if (str == null) {
return null;
}
int count = 0;
int length = str.length();
for (int i = 0; i < length; i++) {
if (str.charAt(i) == ' ') {
count++;
}
}
int newLength = length + 2 * count;//替换后的字符串长度
char[] newChars = new char[newLength];//新的字符数组
int index = newLength - 1;
for(int i=length-1;i>=0;i--) {
if (str.charAt(i) == ' ') {
newChars[index--] = '0';
newChars[index--] = '2';
newChars[index--] = '%';
} else {
newChars[index--] = str.charAt(i);
}
}
return new String(newChars);
//return String.valueOf(newChars);
}
}思路3:java自己的方法
需要对java的API有一定的了解,就可以写出不同的方式。利用replace或者append又或者其他方式。本题的本意是要掌握之前的算法思想!!
public class Solution {
public String replaceSpace(StringBuffer str) {
return str.toString().replace(" ","%20");
//return str.toString().replaceAll("\\s","%20");正则表达式
}
}又或者可以写成
public class Solution {
public String replaceSpace(StringBuffer str) {
String s = str.toString();
if(str==null)
return s;
char [] ch = s.toCharArray();
StringBuffer sb = new StringBuffer();
for(int i = 0; i < ch.length; i++)
{
if(ch[i]==' ')
{
sb.append("%20");
}
else
sb.append(ch[i]);
}
return sb.toString();
}
}


京公网安备 11010502036488号