剑指offer面试题[4]-空格替换

来源:互联网 发布:淘宝防排查软件 编辑:程序博客网 时间:2024/05/22 23:28

题目描述

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

以输入hello word为例分析:

代码及相应注释如下

#include <iostream>
using namespace std;

class Solution {

public:

void replaceSpace(char *str,int length)       //lengt为字符数组str的大小

       { 

        int number_space=0;  
        int str_length=0;
        if(str==NULL||length<=0)
            return;
        for(int i=0;i<length;i++)
            {
               if(*(str+i)==' ')
                   number_space++;               
               if(*(str+i)!='\0')  
                   str_length++;
            }
        int new_str_length=str_length+number_space*2;

        char *p1=str+str_length-1;                  //注意类型指针是字符类型, 指针p1为指向原始str的末尾最后一个字符(非‘\0’)。

        char *p2=str+new_str_length-1;       //指针p2为指向扩展后str的末尾最后一个位置(非‘\0’)。

        for(int i=str_length-1;i>=0;i--)
           {
              if(*p1!=' ')                                         //如果原始str的当前位置不为空,需要将其值赋给扩展数组

                 {                                                     //相应的p1和p2都向前移动一个位置

                     *p2=*p1;
                     p1--;
                     p2--;
                 }
              else                                                 //如果原始str的当前位置为空,则需要将扩招数组的连续三个元素赋为%20
                 {                    
                    *p2='0';                                     //特别需要注意的是这里的倒序输入,先0再2最后%
                    *(p2-1)='2';
                    *(p2-2)='%';
                    p1--;
                    p2=p2-3;                                 //注意这里3
                 }
            
           }                                                   
}

};

//主函数

void main()
{
char str[20]={"hello world"};       //注意这里的str大小一定要大于等于替换后的大小
int length=12;
Solution s;
s.replaceSpace(str,length);
cout<<str<<endl;
}


方法2:

/*class Solution {

public:
void replaceSpace(char *str,int length) 
    {
        int m = 0;
        for(int i = 0;i<length;i++)
            {
            if(*(str+i) == ' ')
                {
                m= i;
                length += 2;
                for(int j = length -1;;j--)
                     {
                    if(j -2 == m)
                        break;
                    else
                        *(str+j) = *(str+j-2);
                }
                *(str+m) = '%';
                *(str+m+1)= '2';
                *(str+m+2) = '0';
            }
      }
    }

};*/

结果: