5. 替换空格

描述

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

示例

输入:s = “We are happy.”

输出:“We%20are%20happy.”

思路

从头开始的惯性思维很容易让我们想到从字符串的第一个字符开始遍历,碰到空格则替换成"%20"。但是这里存在一个问题,那就是"%20"占了三个字符,而空格仅占一个,因此,为了不覆盖后面的有效字符,必须将后面的字符序列整体向后移动两个字符单位,每次移动的代价是O(n),整体算法的复杂度来到了O(n^2)。这显然不是一个高效的方法,我们需要转变一下思维,如果,我们一开始就知道整个字符串的空格数量,那么就能确定替换后的字符串长度,于是,便可以从后往前遍历字符并可以确定每个遍历后的字符的最终位置,这样就避免了重复移动字符。该策略需要先统计字符串的空格数,此操作复杂度为O(n)。随后准备两个指针,第一个指针指向原字符串的最后一个字符,第二个指针指向新字符串的最后一个字符,移动第一个指针,遍历旧字符串,如果是普通字符,则直接赋给第二个指针指向的字符,第二个指针向前移动一位,如果是空格,则第二个指针向前移动三位,依次赋值为’0’、‘2’、’%’。当两个指针相遇时,意味着不可能再有空格了,整个过程可以结束。

代码

    public String replaceSpace(String s) {
        if (s.equals(null))
            return new String("");
        int count = 0;                      // 记录空格数
        // 计算新数组的大小
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == ' ') count++;
        }
        // 新的字符数组
        char[] newStr = new char[s.length() + 2*count];
        // 准备两个指针
        int first;
        int second = s.length() + 2*count - 1;
        // 将旧字符串的内容拷贝到新的字符数组
        for (first = 0; first < s.length(); first++) {
            newStr[first] = s.charAt(first);
        }
        first--;
        // first 指针指向原先字符串的最后一个字符
        // second 指针指向字符数组的最后一个元素
        // 不断将 first 指向的字符移到 second,随后  first 和 second 往前移一格,如果 first 指向空格,则 second 向前移动三格
        // 如果两个指针相遇,代表最后一个空格已经处理完毕
        while (first != second) {
            if (newStr[first] == ' ') {
                newStr[second--] = '0';
                newStr[second--] = '2';
                newStr[second] = '%';
            } else {
                newStr[second] = newStr[first];
            }
            first--;
            second--;   
        }
        return new String(newStr);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值