day19 力扣05 替换空格

文章介绍了在C++中解决LeetCode的05题——替换空格的方法,主要利用双指针技术,从后向前遍历,避免了元素移动的问题,时间复杂度为O(n)。代码实现包括两种策略:一种是创建新数组,另一种是在原数组上扩展进行替换。
摘要由CSDN通过智能技术生成

链接剑指 Offer 05. 替换空格 - 力扣(Leetcode)

 题目

 

思路

  • 一开始想到的是从头开始遍历,记录空格的个数,申请新数组和两个指针,一个指针i指向原字符串第一个元素,第二个指针j指向新字符串第一个元素,当i指向的元素不为空时传入新数组内,当i指向的元素为空时指针j输出‘%20’并往后遍历两个位置,最后输出新数组
  • 看了代码随想录的思路,发现也是用双指针法,不同的是,没有申请新数组(只是扩展了原数组的长度?),从后向前替换空格:申请了两个指针,指针i指向原字符串的最后一个元素,指针j指向新字符串的最后一个位置,同时向前遍历(好处:有效避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题)

 

 

 

 

 

 需要注意的是申请新的数组时 长度应为n+1

 int anslen=slen+2*count;
    char* ans=(char*)malloc(sizeof(char)*anslen+1);
    申请的内存空间为n+1个,使ans[0]位置不存放数据

最终代码

char* replaceSpace(char* s){
    int slen=strlen(s);
    int count=0;
    for(int i=0;i<slen;i++)
    {
        if(s[i]==' ')count++;
    }

    int anslen=slen+2*count;
    char* ans=(char*)malloc(sizeof(char)*anslen+1);
    for(int j=anslen-1,m=slen-1;m>=0;j--,m--)
    {
        if(s[m]!=' ')ans[j]=s[m];
        else{
            ans[j]='0';
            ans[j-1]='2';
            ans[j-2]='%';
            j=j-2;
        }
    }
    ans[anslen]='\0';
    return ans;
}

 时间复杂度O(n) 若不从最后开始往前遍历 则时间复杂度为O(n^2)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值