剑指:替换空格

题目描述

请实现一个函数,把字符串中的每个空格替换成 "%20"

你可以假定输入字符串的长度最大是 1000。 注意输出字符串的长度可能大于 1000

样例

输入:"We are happy."

输出:"We%20are%20happy."

解法

解法一

利用正则匹配替换。

String str = "We are happy.";
        
str = str == null?null : str.toString().replace(" ", "%20");
System.out.println(str);

解法二

先遍历原字符串,计算空格数,可以得知替换后的字符串长度等于原来的长度加上2乘以空格数目。

用指针 i 指向原字符串末尾,j 指向现字符串末尾,ij 从后往前遍历,当 i 遇到空格,j 位置依次要赋值为 '0','2','%',此时i移动1位,j移动3位;若不是空格,直接赋值为 i 指向的字符。

思路扩展:

在合并两个数组(包括字符串)时,如果从前往后复制每个数字(或字符)需要重复移动数字(或字符)多次,那么我们可以考虑从后往前复制,这样就能减少移动的次数,从而提高效率。

public class Solution {
    public static String replaceSpace(StringBuffer str) {
        int spacenum = 0;// spacenum为计算空格数
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == ' ')
                spacenum++;
        }
        int indexold = str.length() - 1; // indexold为为替换前的str下标
        int newlength = str.length() + spacenum * 2;// 计算空格转换成%20之后的str长度
        int indexnew = newlength - 1;// indexold为为把空格替换为%20后的str下标
        str.setLength(newlength);// 使str的长度扩大到转换成%20之后的长度,防止下标越界
        
        for (; indexold >= 0 && indexold < newlength; --indexold) {
            if (str.charAt(indexold) == ' ') { //
                str.setCharAt(indexnew--, '0');
                str.setCharAt(indexnew--, '2');
                str.setCharAt(indexnew--, '%');
            } else {
                str.setCharAt(indexnew--, str.charAt(indexold));
            }
        }
        return str.toString();
    }

    public static void main(String[] args) {
        String str = "We are happy.";
        StringBuffer s = new StringBuffer(str);
        String newstr = replaceSpace(s);
        System.out.println(newstr);
    }
}

时间复杂度O(n)

猜你喜欢

转载自www.cnblogs.com/lisen10/p/11041059.html
今日推荐