002 替换空格
替换空格(学会从后往前的替换思想,来减少移动次数)
题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
方法一:Java调库
public String replaceSpace(StringBuffer str) {
return str.toString().replace(" ", "%20"); // StringBuffer先转成字符串再替换
}
方法二:不调库的方法
- 先计算替换后的字符串需要多大的空间,并对原字符串空间进行扩容;
- 从后往前替换字符串的话,每个字符串只需要移动一次;
- 如果从前往后,每个字符串需要多次移动,效率较低。
具体思路:
(1)用p1指向原始字符串的末尾,p2指向替换之后的字符串的末尾;
(2)向前移动指针p1,逐个把它指向的字符复制到p2指向的位置,直到碰到第一个空格为止;
(3)碰到第一个空格后,把p1向前移动1格,在p2之前插入字符串“%20”,由于“%20”长度为3,同时也要把p2向前移动3格。
// 自己代码(牛客网通过)
public class Demo02 {
public static void main(String[] args)
{
StringBuffer s = new StringBuffer("we are happy.");
System.out.println(replaceSpace(s));
}
public static String replaceSpace(StringBuffer str) {
int i;
int str_len = str.length();
if (str_len <= 0)
return "";
//先遍历一遍,找到所有的空格个数
int spacenum = 0;
for (i = 0; i < str_len; i++)
if (str.charAt(i) == ' ')
spacenum++;
int p1 = str_len-1;
int p2 = p1 + spacenum * 2; // 因为空格本身占用了一个位置,所以替换成%20时,只需增加2个位置即可
str.setLength(p2+1); // 重新调整长度
while (p1!=p2)
{
if (str.charAt(p1)!=' ')
{
str.setCharAt(p2--, str.charAt(p1--)); // 将p1指向的复制到p2指向的
}
else
{
p1--; // 先将p1向前移动一位
str.setCharAt(p2--, '0');
str.setCharAt(p2--, '2');
str.setCharAt(p2--, '%');
}
}
return str.toString();
}
}