题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路分析
用动态的StringBuffer或者StringBuilder类
String适合于不改变内容的字符串,该情况String最快。
若字符串内容经常需要改变,在不考虑线程时,StringBuilder > StringBuffer > String;考虑线程时候用StringBuffer。
public class ReplaceBlank2 {
public static String ReplaceBlank2(String str)
{
if(str == null || str.length()<=0)
return null;
StringBuffer sb = new StringBuffer();
for(int i = 0;i<str.length();i++)
{
if(str.charAt(i)==' ')
sb.append("%20");
else sb.append(str.charAt(i));
}
return sb.toString();
}
public static void main(String[] args)
{
String in1 = "we are happy.";
String in2 = null;
String in3 = "";
String in4 = " ";
String in5 = "wearehappy.";
System.out.println("out1:"+ReplaceBlank2(in1));
System.out.println("out2:"+ReplaceBlank2(in2));
System.out.println("out3:"+ReplaceBlank2(in3));
System.out.println("out4:"+ReplaceBlank2(in4));
System.out.println("out5:"+ReplaceBlank2(in5));
}
从后向前替换
替换字符串中的空格,若从前往后替换,每次遇到空格,就需要把后面的字符都位移一次。考虑从后往前替换。
- 先计算出新字符串的长度(原字符串长度+空格数*2),开辟该大小的字符数组,
- 辅助两个指针(下标),left指向原字符串末尾,right指向新字符串末尾。
- 从后向前遍历原字符串,遇到空格则right左移三个并补充上%20,left左移一个;遇到非空格则复制到right处,left和right左移一个。
- 注意边界判断
注意:合并两个有序数组,字符串中空格替换,高效方法:从后向前复制,使用两个指针,可以减少移动次数。
代码
public class ReplaceBlank {
public static String ReplaceBlank(String str)
{
if(str == null || str.length() <= 0)
return null;
int blankNum = 0;
for(int i = 0; i<str.length();i++)
{
if(str.charAt(i) == ' ')
blankNum++;
}
int newLength = str.length() + 2*blankNum;
char[] newChar = new char[newLength];
int left = str.length() - 1;
int right = newLength - 1;
for(;left>=0;left--)
{
if(str.charAt(left)==' ')
{
newChar[right--] = '0';
newChar[right--] = '2';
newChar[right--] = '%';
}
else newChar[right--] = str.charAt(left);
}
return new String(newChar);
}
public static void main(String[] args)
{
String in1 = "we are happy.";
String in2 = null;
String in3 = "";
String in4 = " ";
String in5 = "wearehappy.";
System.out.println("out1:"+ReplaceBlank(in1));
System.out.println("out2:"+ReplaceBlank(in2));
System.out.println("out3:"+ReplaceBlank(in3));
System.out.println("out4:"+ReplaceBlank(in4));
System.out.println("out5:"+ReplaceBlank(in5));
}
}