剑指Offer-5:替换字符串的空格

题目:

请实现一个函数,将一个字符串中的空格替换成“%20”。

Example:

例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

问题解析:

一个字符用3个字符替换,注意字符串覆盖的问题。

链接:

剑指Offer(第2版):P51

思路标签:

算法:双指针

从前向后——由后到前

解答:

1. C++
  • 从前向后遍历寻找到空格,并移动后面元素再进行替换的想法很简单,但是时间复杂度高,每一个空格后面的元素都要向后移动,会涉及后面的元素存在多次移动的问题,时间复杂度为O(n);
  • 但是如果换一种思路,先规定好字符数组可允许访问的长度。统计原字符串中所拥有的空格数。使用两个指针P1和P2,P1指向原字符串的末尾,P2指向替换后的字符串的末尾。从后向前复制字符串,遇到空格,P2从后向前添加符号,移动3个单位,P1则向前移动1个单位。当P1和P2相遇时则说明所有空格已经替换。
class Solution {
public:
    void replaceSpace(char *str, int length) {
        if (str == nullptr || length <= 0) return;

        int originalLength = 0;
        int numberOfBlank = 0;
        int i = 0;
        while (str[i] != '\0') {
            ++originalLength;
            if (str[i] == ' ')
                ++numberOfBlank;
            ++i;
        }

        int newLength = originalLength + 2 * numberOfBlank;
        if (newLength > length) return;

        int indexOfOriginal = originalLength;
        int indexOfNew = newLength;
        while (indexOfOriginal >= 0 && indexOfNew > indexOfOriginal) {
            if (str[indexOfOriginal] == ' ') {
                str[indexOfNew--] = '0';
                str[indexOfNew--] = '2';
                str[indexOfNew--] = '%';
            }
            else {
                str[indexOfNew--] = str[indexOfOriginal];
            }
            --indexOfOriginal;
        }
        return;
    }
};

测试样例:

void main() {
    Solution solution;
    char strings[] = "We are happy.";

    solution.replaceSpace(strings, 20);
    cout << strings <<endl;
    return;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值