《剑指offer》4:替换空格

题意

给定一个字符串,将其中的所有空格都替换成”%20”三个字符,比如“I am happy.”将会变成”I%20am%20happy.”,假设给定的指针所指向的内存是够用的,然后O(1)空间和O(n)时间。

思路

先统计空格的个数,就能够建立起老的字符到新的位置的映射了。

主要是觉得书里的代码写得效率不高,所以po一下代码:

#include <iostream>
using namespace std;

void replaceBlank(char* str) {
    // 处理空指针的异常
    if (str == NULL)
        return;
    int countOfSpace = 0;
    char* now = str;
    while (*now != '\0') {
        if (*now++ == ' ')
            ++countOfSpace;
    }
    // 一个小细节
    if (countOfSpace == 0)
        return;

    char* newStr = now + (countOfSpace << 1);
    while (now >= str) {
        if (*now == ' ') {
            *newStr-- = '0';
            *newStr-- = '2';
            *newStr-- = '%';
        } else {
            *newStr-- = *now;
        }
        --now;
    }
}

int main() {
    char str1[] = "hello jacket, good night\0aaaaaaaaaa";
    cout << str1 << endl;
    replaceBlank(str1);
    cout << str1 << endl;

    return 0;
}

为什么我说书里的代码不够优化呢?有两点吧:
1. 没有给出countOfSpace等于0优化;
2. 对于字符的操作是通过str[index]来引用的,这个其实比直接用指针多了一点计算,因为str[index] = str + index*sizeof(char)。

关于优化的评价

对于第1点,其实得看场景的,如果输入都是有空格的,那么这个判断就没必要了。

对于第2点,编译器或许会对循环进行优化,所以也不是大问题。

不过在不影响可读性的情况下,我还是会喜欢用不依赖编译器优化就可能提高效率的写法。

最近有个朋友跟我说,java代码会在编译的时候自动优化的,不要花力气帮编译器做事啊^_^萝卜青菜吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值