剑指Offer:替换空格

题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输入“We%20are%20happy.”。

由于空格是一个字符,而%20是三个字符‘%’‘2’‘0’。要完成这个替换,首先必须要保证原字符串的长度够长,否则就会造成内容覆盖的问题。接下来我们的思路就是遍历,然后遇到空格进行替换。但是我们想想,每次替换都会面临着一个移动的过程。将空格后的字符串向后移动两个位置,接着,再进行替换。那么完全替换结束后,这个移动的过程是非常多次的,而且有很多字符移动了好几遍。那么如何减少移动次数呢?
我们可以在移动之前先遍历字符串。找出字符串的空格个数。然后乘以二加上之前的字符串长度。这个就是替换过后的字符串长度。接下来,我们从后往前移动,由于是从后往前移动,所以这个时候不牵扯到覆盖问题。
这里我们以“We are”举例。
这里写图片描述
这里首先两个指针,当p2遇到空格时,p2++,此时p1继续赋值为‘0’‘2’‘%’然后p1++。一直持续到p1 == p2,替换完毕。

#include <stdio.h>

void ChangeSpace(char* str, int sz)
{
  if(str == NULL || sz <= 0) {
    return;
  }

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

  int newlen = len + space*2;
  if(newlen > sz) {
    return;
  }

  int index_1 = len;
  int index_2 = newlen;
  while(index_1 >= 0 && index_2 > index_1) {
    if(str[index_1] == ' ') {
      str[index_2--] = '0';
      str[index_2--] = '2';
      str[index_2--] = '%';
    } else {
      str[index_2--] = str[index_1];
    }
    --index_1;
  }
}

void PrintStr(char* str, int sz)
{
  if(str == NULL) {
    return;
  }

  int i = 0;
  for(; i < sz; ++i) {
    if(str[i] == '\0') {
      break;
    }
    printf("%c",str[i]);
  }
  printf("\n");
}

int main()
{
  char str[64] = "We are happy.";
  int sz = sizeof(str)/sizeof(str[0]);

  ChangeSpace(str, sz);
  PrintStr(str, sz);

  return 0;
}

这里写图片描述


欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!

猜你喜欢

转载自blog.csdn.net/liuchenxia8/article/details/80142927
今日推荐