剑指offer第四题方法总结

题目:输入一个字符串,要求将这个字符串中所有空格的位置都替换成”%20“.例:输入I love you. 输出I%20love%20you.
分析:空格是一个字符,%20是三个字符,所以替换的时候要向后挪动。
          这里有三种方法。
          第一种:从前向后遍历字符串,遇到一个空格,则将这个空格之后的字符'\0'开始依次向后挪动两个字符,然后再放入%20,直到遍历完整个字符串。这种方法效率比较低。
          第二种:重新创建一个字符数组,将这个字符串拷贝过来,遇到空格就替换成%20. 这种方法虽然效率高,但是空间复杂度却增高了。
          第三种:先统计整个字符串中空格的数量。再'\0'开始向后一次挪动2*空格数,遇到一次空格,则空格数减一,并且将%20放入。直到空格数为0. 这种方法时间和空间相对来说都是最理想的。


在这里我们只实现第三种:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

char *replace_blank(char src[])
{
      assert(src );
      int blank = 0;
      char *psrc = src ;
      while (*psrc)                       //统计空格个数,同时让psrc指向‘\0'
      {
          if (*psrc == ' ' )
               blank++;
            psrc++;
      }
      while (blank)
       {
           if (*psrc== ' ' )                               //遇到空格开始替换
            {
               *(psrc+blank*2)= '0';
               *(psrc+blank*2-1)= '2';
               *(psrc+(--blank)*2)= '%';
            }
            else
              *(psrc+blank*2)= *psrc;
           psrc--;
       }
      return src ;
}


int main()
{
                char src[50] = { 0 };
                gets(src);
                char *ret = replace_blank(src);
                printf( "%s\n", ret);
                system( "pause");
                return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值