一、题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为 We Are Happy. 则经过替换之后的字符串为 We%20Are%20Happy。注:用 %20 替换的原因,空格在 ASCII 码中的序号为 32,用十六进制表示为 0x20。
二、思路分析
参考剑指 offer 上的说明,需要考虑操作是原地(in place)操作还是新建字符串操作。以原地操作为例,首先考虑最直观的方法 - 从前往后依次替换。在第一个空格处,空格替换为 %20,空格之后的字符全部右移三个位置。同理,第一次移动后,向后遍历,在第二个空格处继续将后边字符移动。
从算法角度分析,设输入规模为 n,我们需要循环遍历字符串中空格(循环中,判断是否为空的操作执行 n 次),在每个空格处,进行字符移动操作,每个字符的移动又相当于一次循环。因此,总的运行效率为
$$
O(n^2)
$$
直接遍历移动的方法效率太低,因此,考虑其他方法。方法 1:考虑比 Sting 高效的字符串操作工具 -StringBuffer,同样使用之前的直接遍历的方法,但是对比发现,不需要重复移动,每次判断执行一次操作,共执行 n 此判断,效率为 $$O({n^2})$$ 方法 2:不使用 StringBuffer
三、Java 实现
方法 1 源程序:
package jz_offer;
public class problem04 {
public static String spaceReplace(String str) {
StringBuffer newStr=new StringBuffer();
int length=str.length();
// 特殊情况
if(str==null||length==0)
return null;
for(int i=0;i<length;i++) {
if(str.charAt(i)==’ ‘) {
newStr.append(“%20″);
}else {
newStr.append(str.charAt(i));
}
}
return newStr.toString();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
// 包含空格 -:前 - 后 - 中 - 连续空格
String str1 = ” Wearehappy”;
String str2 = “Wearehappy “;
String str3 = “We are happy”;
String str4 = “We are happy “;
// 没有空格
String str5=”Wearehappy”;
// 特殊输入测试:只有连续空格、只有一个空格、是 null 指针、是空字符串
String str6=” “;
String str7=” “;
//String str8=null; // 会出现 NullPointerException(运行时异常)
String str8=””;
String[] strArray=new String[] {str1,str2,str3,str4,str5,
str6,str7,str8};
for(int i=0;i<strArray.length;i++) {
System.out.println(spaceReplace(strArray[i]));
}
}
}