面试题2:替换空格

来源:互联网 发布:思维江硬 知乎 编辑:程序博客网 时间:2024/06/06 12:56

来源:《剑指Offer》

题目:请实现一个函数,把字符串的每个空格替换成”%20”,原字符串后面有足够的空间,要求在原字符串上操作。例如输入”we are happy”,则输出”we%20are%20happy”。

分析:先遍历一遍统计出空格数,一个空格替换成三个字符,长度增加了2,N个空格,长度增加2N。则
替换后的字符串长度 = 原字符串长度 + 2N
设置两个指针,一个指向原字符串末尾,一个指向新字符串末尾。第二遍遍历,从后往前遍历。将原字符串最后一个字符复制到新字符串最后一个字符的位置,两个指针同时前移。当原字符串遇到空格,在新字符串对应位置插入”%20”三个字符,接着原字符串指针前移1位,新字符串指针前移3位。如此操作,直到原字符串第一个字符也复制完结束。

代码(C++):

#include<iostream>using namespace std;#define MAX_LEN 100/*    函数功能:替换字符串中的空格  */void replaceBlank(char data[]){    int i=0,j;    int old_len;    int new_len;    int blank_num=0;    // 遍历一遍,找出空格数    while(data[i]!='\0')    {        if(data[i]==' ')        {            blank_num++;        }        i++;    }    //-----------这里是关键------------    // 原来字符串长度    old_len=i+1;    // 计算新字符串长度    new_len=old_len+2*blank_num;    // 重置i,j    i=old_len-1;    j=new_len - 1;    //-----------这里是关键------------    // 再遍历一遍,替换空格    while(i>=0)    {        if(data[i]!=' ')        {            data[j]=data[i];                    j--;        }        else        {            data[j]='0';            data[j-1]='2';            data[j-2]='%';            j-=3;        }        i--;    }}int main(){    char str[MAX_LEN];// 声明一个字符数组    // 输入数组    cout<<"请输入一个字符串,不超过20个字符"<<endl;    gets(str);    // 替换    replaceBlank(str);    // 打印    cout<<str<<endl;    return 0;}
0 0
原创粉丝点击