I. 问题描述

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

OJ: NowCoder

II. 思路

对每一个空格, 占位长度为 1, 而一个 %20, 占位长度为 3. 也就是说, 有 N 个空格, 那么替换后的字符串长度应该就是 old_length + 2*N, 所以思路就是把原有的字符串扩展到有被替换的长度, 然后由后往前, 逐个替换位置上应该出现的字符.

比如 A B, 那么扩展长度后就应该是 A B , 然后首先先将 B 移动到最后一个位置 A B, 之后把三个空格,替换为 %20, 就变成了 A%20B

III. JAVA 实现

public class Solution {
    public String replaceSpace(StringBuffer str) {
        int oldLen = str.length();
        
        // 先扩展原有字符串的长度
    	for(int i = 0; i < oldLen; i ++){
            if(str.charAt(i) == ' '){
                str.append("  ");
            }
        }
        
        int oldIdx = oldLen - 1;
        int newIdx = str.length() - 1;
        
        // 替换每一个位置的字符,由后致前
        while(oldIdx >= 0 && newIdx > oldIdx){
            char c = str.charAt(oldIdx--);
            if(c == ' '){
                // 逆序替换空格
                str.setCharAt(newIdx--, '0');
                str.setCharAt(newIdx--, '2');
                str.setCharAt(newIdx--, '%');
            }else{
                // 替换正常字符
                str.setCharAt(newIdx--, c);
            }
        }
        
        return str.toString();
    }
}

Share this on