每日一题11:替换字符串中的空格

用指定的字符或字符串替换某个字符串中出现的所有空格,当用字符替换字符是,自然是很简单的,但是当使用字符串替换字符时,如果还是从前往后遍历,遇到指定字符就将其后所有字符往后移出足够空间的话,当字符串中的空格很多时,反复的移动字符会带来性能上的损失。但是如果是从后往前遍历呢?可以先遍历一次原字符串,得到字符串中空格的个数,然后就可以计算出实际需要的空间,再假设原字符串所在缓冲区有足够空间(否则新建一个缓冲区从前往后遍历就行了,这里说的是在不新建缓冲区的情况下做这件事),那么就可以计算出每个字符最后的位置,到算法中可以用一个指针q指向替换后字符串的最后一个字符(也就是字符串结束符)所在的位置,指针p指向原字符串的最后一个字符(字符串结束符),然后两个指针向前遍历,如果p指向的字符为空格,那么就将替换字符串从后向前填充到q指向的位置(该过程中p不动,q继续向前,第一次遍历后所做的计算保证q不会追上p),然后两个指针继续向前遍历。这样就得到一个O(N)的算法了。

#include "stdafx.h"
#include <iostream>
using namespace std;

const int bufsize = 1024;

void Replace(char** str, char target_char,const char* replace_str)
{
    int replace_str_len = strlen(replace_str);
    char* p = *str;
    int target_char_fre = 0;
    int str_len = 0;
    while(*p)
    {
        if(*p == target_char) ++target_char_fre;
        ++str_len;
        ++p;
    }
    int extend_count = target_char_fre * (replace_str_len - 1);
    char * q = p + extend_count;
    int j = 0;
    while(j <= str_len)
    {
        if(*p != target_char)
            *q-- = *p--;
        else
        {
            const char* r = &replace_str[replace_str_len - 1];
            int i = 0;
            while(i < replace_str_len)
            {
                *q-- = *r--;
                ++i;
            }
            --p;
        }
        ++j;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    char * str = new char[bufsize];
    strcpy(str," wo shi zhong guo ren!");
    Replace(&str,' ',"%20");
    cout<<str<<endl;
    return 0;
}

这里写图片描述
如果从一个方向走不通,那就换个方向试试!这种方法还可以用于数组的插入等类似的情景中。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值