剑指offer:替换空格 题目 解题思路 具体代码

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

解题思路

这题是很简单的字符串替换问题,最容易想到的就是从前往后依次替换,比较让人困惑的是所给函数形参中length的作用。
在查看题目的讨论区时,发现从后往前替换会明显优于从前往后的替换,因为在前者的替换过程中,不需要进行字符的移动,能够大幅度提升效率。在下文中给出的是更优的从后往前替换的代码。同时,讨论区中,大家认为题中的length指的是需返回字符串的最大长度,这一要求也在代码中有体现。

具体代码

1.从后往前替换字符串

class Solution {
public:
	void replaceSpace(char *str,int length) {
        // 排除非法字符串的可能
        if (str == NULL || length < 0) {
            return;
        }
        
        // 初始化字符串原始长度、字符串目标长度、字符串中空格数
        int oldLength = 0;
        int newLength = 0;
        int spaceNumber = 0;
        
        // 遍历字符串求出上述参数
        for (int i = 0; str[i] != ' '; i++) {
            oldLength++;
            if (str[i] == ' ') {
                spaceNumber++;
            }
        }
        newLength = oldLength + spaceNumber * 2;
        
        // 如果目标长度大于给出长度要求则结束函数
        if (newLength > length) {
            return;
        }
        
        // 从后往前处理字符串
        for (int i = oldLength; i >= 0; i--) {
            if (str[i] == ' ') {
                str[newLength--] = '0';
                str[newLength--] = '2';
                str[newLength--] = '%';
            } else {
                str[newLength--] = str[i];
            }
        }
	}
};