字符串的替换空格问题

题目:把字符串中的空格替换成%20,例如 “we are happy”替换成“we%20are%20happy”;

思路分析:如果从头遍历,遇到空格就替换,则后面整个串都要移动,这样下来,时间复杂度就会很大,那么,为何不考虑从后往前替换呢。

#include<stdio.h>
#include<malloc.h>
//把空格替换成%20
//两种方法:1、创建一个新的数组
//2、在原有数组上进行更改
char* ReplaceBlank1(char *string)
{
     if(string == NULL)
     {
          return NULL;
     }
     int length = 0;
     int black = 0;
     int i = 0;
     while(string[i] != '\0')
     {
          length++;
          if(string[i] == ' ')
          {
              black++;
          }
          i++;
     }
     char *tmp = (char *)malloc(sizeof(char)*(length+black*2)+1);
     i = 0;
     int j = 0;
     for(;i<=length;i++)
     {

          if(string[i] == ' ')
		  {
              tmp[j] = '%';
              tmp[++j] = '2';
              tmp[++j] = '0';
          }
          else
          {
              tmp[j] = string[i];
          }
          j++;
     }
     return tmp;
}

void ReplaceBlank2(char *string,int length)
{

     if(string == NULL || length<0)
     {
          return;
     }
     int old = 0;
     int black = 0;
     int i = 0;
     while(string[i] != '\0')
     {
          old++;
          if(string[i] == ' ')
          {
              black++;
          }
          i++;
     }
     int newlen = old + black*2 +1;//得到新的串的大小
     for(int j = old+1;j>=0;--j)
     {
          if(string[j] != ' ') //如果不等于空格,则一直插入即可
          {
              string[newlen--] = string[j];
          }
          else //如果等于空格,就进行替换
          {
              string[newlen--] = '0';
              string[newlen--] = '2';
              string[newlen--] = '%';
          }
     }
}

int main()
{
     char arr[50] = "We are student. ";
     int length = sizeof(arr)/sizeof(arr[0]);
     char *tmp = ReplaceBlank1(arr);
     ReplaceBlank2(arr,50);
     printf("%s\n",arr);
     printf("%s\n",tmp);
     free(tmp);
}
总结:学会找到最简单的办法,时间和空间复杂度越小越好咯。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值