题目、替换空格
请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“I love you”,则输出“I%20are%20happy”。
分析
方法一,从头到尾扫描字符串,每次碰到空格字符的时候进行替换。由于是把一个字符替换成三个字符,我们必须要把空格后面所有的字符都后移2字节,否则就有两个字符被覆盖了。时间复杂度为O(n的平方)。
方法二,从尾到头扫描字符,每次碰到空格字符的时候进行替换。由于是从尾到头扫面字符,故前面的字符不需要进行移动。时间复杂度为O(n)。
完整代码
package com.xuexi.offer.offer5;
/**
* Created by lhw on 2019/12/14.
*/
public class ReplaceSpaces {
public static void main(String[] args) {
String beforeReplace = "I love you";
String afterRepalce = repalceSpaces(beforeReplace);
System.out.println("替换前:"+ beforeReplace);
System.out.println("替换后:"+ afterRepalce);
}
public static String repalceSpaces(String beforeReplace){
if(beforeReplace == null) {
return "字符串不能为空";
}
//将字符串转换为数组
char[] beforeChar = beforeReplace.toCharArray();
//替换前数组长度
int beforeLength = beforeChar.length;
//替换后数组长度
int afterLength = beforeLength;
for(int i = 0; i < beforeLength; i++){
if(String.valueOf(beforeChar[i]).equals(" ")){
afterLength += 2;
}
}
//替换后的char数组
char[] afterChar = new char[afterLength];
afterLength = afterLength - 1;
for(int i = beforeLength-1; i >= 0; i--){
if(i == afterLength){
for(int j = i; j >= 0; j--){
afterChar[j] = beforeChar[j];
}
break;
}else if(beforeChar[i] != ' '){
afterChar[afterLength] = beforeChar[i];
afterLength--;
}else if(beforeChar[i] == ' '){
afterChar[afterLength] = '0';
afterChar[--afterLength] = '2';
afterChar[--afterLength] = '%';
afterLength--;
}
}
String afterRepalce = new String(afterChar);
return afterRepalce;
}
}