[剑指Offer]替换空格

10 篇文章 0 订阅
今天看题的时候,遇到一个替换空格的题目,分析一下哈。
题目要求:把字符串中的每个空格替换成“%20”。例如输入“we are happy”,则输出“we%20are%20happy”。
解题思路:我们首先想到的是:移位思想。遇到空格就将空格后的所有字符后移两位,然后填充空格为%20。
实现代码
#pragma once
#include<assert.h>
#include<string.h>

char* StrReplace(char* str,size_t length)
{
    assert(str && length > 0);
    char *p = str;
    char *p1 = str;
    size_t len = strlen(str)+1;
    size_t i = len;
    while(p)
    {
        while(*p != ' ')
        {
            p++;
            if(*p == '\0')
            {
                return str;
            }
        }

        while((p1+i) != p)
        {
            *(p1+i+1) = *(p1+i-1);
            i--;
        }
        len+=2;
        i = len;
        *p = '%';
        *(p+1) = '2';
        *(p+2) = '0';
        p+=2;
    }
    return str;
}


void Test()
{
    char str[20] = "we are happy";
    cout<<StrReplace(str,20)<<endl;
}
但是,我们再看看它的时间复杂度哈。显然,每次移位操作都是O(N),这样经过多次移位,使它的时间复杂度就变为O(N^2)。这样的效率实在有点低。我们如何提高它的时间复杂度呢?
思路2:我们可以用计数的方式,统计字符串中总共的空格数,然后从后向前移位,使用两个指针,p1指向字符串开始的位置,p2指向字符串尾部,移位将p2移动2*空格个数位,遇到空格后填充,直到两指针相遇,才停止移位。如图所示(移位过程):

这里写图片描述

实现代码
#pragma once
#include<assert.h>
#include<string.h>
char* StrReplace(char* str,size_t length)
{
    assert(str && length > 0);
    char *p = str;
    char *p1 = NULL;
    char *p2 = NULL;
    size_t len = strlen(str);
    int count = 0;
    //统计空格数
    while(*p != '\0')
    {
        if(*p == ' ')
            count++;
        p++;
    }
    count*=2;

    p1 = str+len;        //指向字符串尾
    p2 = str+len+count;  //指向修改后字符串正确的位置

    while(p1 != p2)
    {
        if(*p1 == ' ')
        {
            p2 -= 2;
            *p2 = '%';
            *(p2+1) = '2';
            *(p2+2) = '0';
            if(p1 != p)    //如果p1没有到字符串头时再减,防止越界
            {
                p1--;
                p2--;
            }
        }
        else              //不是空格则直接后移
        {
            *p2 = *p1;
            p1--;
            p2--;
        }

    }

    return str;
}

void Test()
{
    char str[20] = "we are happy";
    cout<<StrReplace(str,20)<<endl;
    char str1[20] = " are happy";
    cout<<StrReplace(str1,20)<<endl;
}
执行结果

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值