剑指Offer-替换空格

题目: 请实现一个函数,把字符串的每一个空格替换成%20. 例如输入 we are happy, 输出we%20are%20happy

最简单但是效率很低的做法,是从头到尾扫描字符串,每碰到一个空格就将其替换长%20,同时将字符串向后移动两格,否则%20会将字符串内容覆盖。这种做法的时间复杂度是O(N 2 ^2 2)。

另外一个做法是先扫描一次字符串,确定有多少空格后就能知道字符串在替换后的容量了。再从尾到头扫描字符串,将字符复制的新开辟的区域内,碰到空格就将其替换成%20,就可以完成。
替换的过程如下图:来自剑指offer
在这里插入图片描述
声明指针P1指向替换前的字符串末尾,指针P2指向替换后的字符串末尾。不断将P1的字符拷贝到P2中,直到P1遇到空格后,P2依次填入%20。直到复制完成。
下边是实现的代码:

void ReplaceSpaces(char string[], int len){
  //判断输入正确性,len为字符串最大长度
  if(len <= 0 || string==nullptr) return;

  int space = 0;
  int i = 0;
  while(string[i]!='\0'){
    if(string[i]==' ') space++;
    ++i;
  }

  int OriginalLength = i;
  int NewLength = OriginalLength + space*2;
  if(NewLength>len) return;

  int NewIndex = NewLength - 1;
  int OldIndex = OriginalLength - 1;

  while(OldIndex >= 0){ 
    while(string[OldIndex]==' ') {
      string[NewIndex--] = '0';
      string[NewIndex--] = '2';
      string[NewIndex--] = '%';
      OldIndex--;
    }   
    
    string[NewIndex--] = string[OldIndex--];
  }
}

测试用例:

  • 输入字符串包含空格,空格可能在最前面,最后面,也有可能有多个空格
  • 输入字符串没有空格
  • 输入字符串无效,为空指针
  • 输入字符串为多个空格
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值