面试题05:替换空格

限于喜欢 提交于 2020-02-28 01:04:57

题目描述

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

思路

可以通过将字符串长度变长的方式去替换,即把空格占用的空间从 1 个字符变成 3 个字符。

如果有一个空格,那么就要把空格替换成 %20,替换后占用 3 个字符,而空格占 1 个字符,也就是说,字符串的长度加 2 了。

首先要先确定字符串中空格的个数,以此来确定新字符串的长度应该是多少。

经过简单计算,可得到 新字符串的长度 = 原长度 +(2 * 空格个数)。

然后定义两个指针 p1, p2 去分别指向原字符串的结尾位置以及新字符串的结尾位置。

如果 p1 指向的字符不是空格,那么将 p1 指向的字符赋值到 p2 所指向的位置,之后 p1,p2 分别向前移动一位。

如果 p2 指向的字符是空格,那么将 p2 的位置向前移动 3 个位置,并且在移动的过程中,分别赋值为 0,2,%。移动完毕后,p1 向前移动一位。

只要 p1 >= 0 并且 p1 与 p2 位置没有重合,那么就一直判断下去,直至把原字符串过一遍。

代码

public class Solution {
    public String replaceSpace(StringBuffer str) {
        if (str == null || str.length() <= 0) {
            return "";
        }
        
        // 字符串原长度
        int originalLength = str.length();
        // 字符串新长度
        int newLength;
        // 空格个数
        int numberOfBlank = 0;
        
        // 确定空格个数
        for (int i = 0; i < originalLength; i++) {
            if (str.charAt(i) == ' ') {
                numberOfBlank++;
            }
        }
        
        // 不存在空格,返回原字符串
        if (numberOfBlank == 0) {
            return str.toString();
        }
        
        newLength = originalLength + (2 * numberOfBlank);
        // 扩充
        str.setLength(newLength);
        
        int p1 = originalLength - 1;
        int p2 = newLength - 1;
        
        while (p1 >= 0 && p1 != p2) {
            char ch = str.charAt(p1);
            
            // 不是空格
            if (ch != ' '){
                str.setCharAt(p2, ch);
                p2--;
            } else {
                str.setCharAt(p2--, '0');
                str.setCharAt(p2--, '2');
                str.setCharAt(p2--, '%');
            }
            p1--;
        }
        
        return str.toString();
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!