java版替换空格

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

 

这个问题有两种解法:一是我们需要再原来的字符串上做替换。二是创建新的字符串并在新的字符串上替换。
对于第一种情况,在原来的字符串上做替换,如果从头到尾扫描字符串,每一次碰到空格字符的时候做替换。由于是把1个字符替换成3个字符,我们必须要把空格后面所有的字符都后移两个字节,否则就有两个字符被覆盖了。假设字符串的长度是n,对于每个空格字符,需要移动后面O(n)个字符,因此对于含有O(n)个空格字符的字符串而言总的时间效率是O(n2)。怎么让时间复杂度更低一点,答案是我们可以从后往前遍历。

思路:
(1)我们可以先遍历一遍字符串,统计出字符串空格的总数,并由此可以计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。
(2)准备两个指针,比如p1和p2。p1指向原始字符串的末尾,而p2指向替换之后的字符串的末尾。
(3)向前移动指针p1, 逐个把它指向的字符复制到p2所指的位置,直到碰到第一个空格为止。
  (4) 在碰到第一个空格后,把空格替换成“%20”,把第一个指针向前移动1格,把第二个指针向前移动3格。
(5)依次向前复制字符串中的字符,直到p1和p2指向同一位置。

demo:

public class TestDemo {
    public static void main(String[] args) {
        StringBuffer dd = new StringBuffer("we are very happy");
        System.out.println(replaceSpace(dd));

    }

    public static String replaceSpace(StringBuffer str) {
        int numBlock = 0;
        int j = str.length() - 1;
        for(int i = 0; i <= j; i++) {
            if(str.charAt(i) == ' ') {
                numBlock++;
            }
        }
        int newLength = str.length() + 2 * numBlock;
        int i = newLength - 1;
        str.setLength(newLength);
        while(i >= 0 && j >=0 && i >= j) {
            if(str.charAt(j) == ' ') {
                str.setCharAt(i--, '0');
                str.setCharAt(i--, '2');
                str.setCharAt(i--, '%');
            }
            else {
                str.setCharAt(i--, str.charAt(j));
            }
            j--;
        }
        return str.toString();
    }
}

第二种解法是创建新的字符串并在新的字符串上替换。

新创建一个string对象,从前往后遍历,如果是空格,则添加“%20”,否则添加对应的字符。因为有足够的内存空间,所以这种方法下无论从先往后遍历还是从后往前遍历都是可以的。

demo:

    public static String replaceSpace1(StringBuffer str) {
        StringBuffer res = new StringBuffer();
        int len = str.length() - 1;
        for(int i = 0; i <= len; i++){
            if(str.charAt(i) == ' ')
                res.append("%20");
            else
                res.append(str.charAt(i));
        }
        return res.toString();
    }

 

注:在网络编程中,如果URL参数中含有特殊字符,如空格、“#”等,可能会导致服务端无法获取正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。
转换的规格是在‘%’后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换为“%20”。再比如“#”的ASCII码为35,即十六进制的0x23,它在URL中被替换为“%23”。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值