002 替换空格

替换空格(学会从后往前的替换思想,来减少移动次数)

题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

方法一:Java调库

public String replaceSpace(StringBuffer str) {
    	return str.toString().replace(" ", "%20"); // StringBuffer先转成字符串再替换
}

方法二:不调库的方法

  1. 先计算替换后的字符串需要多大的空间,并对原字符串空间进行扩容;
  2. 从后往前替换字符串的话,每个字符串只需要移动一次;
  3. 如果从前往后,每个字符串需要多次移动,效率较低。

具体思路:

(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();
    }

}
posted @ 2019-10-07 16:25  helloHKTK  阅读(229)  评论(0编辑  收藏  举报