处理字符串的问题
题目4:替换空格
题目描述:
请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。
算法思想:
1、如果 从前往后,每次扫描到一个空格,替换为%20的话,那么每次替换后数组都要往后移位(O(n^2));
2、先遍历一次数组,统计出字符串中的空格总数,每替换一个空格,长度增加2,因此替换后的字符串的长度等于原来长度加上2乘以空格数目,所有字符只移动一次,时间复杂度O(n)。
代码实现
package swordToOffer;
public class Num4_ReplaceBlank {
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuffer s = null;
String result = RepalceBlank(s);
System.out.println(result);
StringBuffer s1 = new StringBuffer("ab2s4");
result = RepalceBlank(s1);
System.out.println(result);
StringBuffer s2 = new StringBuffer("a b45 dd");
result = RepalceBlank(s2);
System.out.println(result);
StringBuffer s3 = new StringBuffer("");
result = RepalceBlank(s3);
System.out.println(result);
}
//StringBuffer---线程安全 StringBuilder---非线程安全 长度可变
public static String RepalceBlank(StringBuffer str) {
if(str==null) {
System.out.println("input is null");
return null;
}
int originalLength = str.length();
int numberOfBlank = 0;
//int i=0;
for(int i=0;i<str.length();i++) {
//originalLength++;
if(str.charAt(i)==' ') {
numberOfBlank++;
}
}
int newLength = originalLength+numberOfBlank*2;
//if(newLength==str.length()) return str.toString();
str.setLength(newLength);
int indexOfOriginal = originalLength-1;//会出现溢出
int indexOfNew = newLength-1;//
while(indexOfOriginal>=0&&indexOfNew>indexOfOriginal) {
if(str.charAt(indexOfOriginal)==' ') {
str.setCharAt(indexOfNew--, '0');
str.setCharAt(indexOfNew--, '2');
str.setCharAt(indexOfNew--, '%');
}else {
str.setCharAt(indexOfNew--,str.charAt(indexOfOriginal));
}
indexOfOriginal--;
}
return str.toString();
}
}
输出结果:
input is null
null
ab2s4
a%20b45%20dd
分析:
如果遇到在进行数据替换或者需要移动多次时,可以考虑从后向前移动,从而减小移动次数
时间复杂度O(n) 空间复杂度O(1)