记一个面试常考题----把一个字符串中的空格换成%20

    最近心里很烦躁,单位项目多,任务重,导师给的压力也很大,自己一个人在这边,心里总会不舒服吧,慢慢克服吧,还是希望自己能找到满意的工作。
说说这个笔试题,给一个字符串中的空格全部换成“%20”,这种要求一般出现在url中,服务器一般对空格的识别不好,把空格用asscii码表示可以解决这个问题,但是也有个问题,如果把空格换成了字符串,那么整个字符串的长度必然发生变化,空格后的每一个字符都要进行移位操作,我们都知道,对一个数组进行移位操作,代价是很高的哦,一般遍历的算法,很容易搞出个O(n^2)复杂度的算法,然后你的笔试估计就悲剧了。。。。
这里一个巧妙的算法可以保证在同一个字符串中修改,不用新创建一个字符串,而且复杂度为O(n),即,首先得到原本字符串中字符的个数,而修改后的字符串的长度就应该是:
原来的长度+空格的个数*2(别问我为什么哈。。。)
然后,用两个指针*p1,*p2,分别指向原来字符串的末尾,和修改后长度的字符串的末尾。这里注意:原本字符串的长度是足够长的呢。

然后把p1指向的字符,赋给p2,如果遇到空格,p2就添加“%20”同时,当然得指针移动了,如果两个指针位置相同,OK,结束循环。。。
下面是代码:(已测试可运行良好)


#include "stdafx.h"
#include<iostream>
using namespace std;
void replaceBlank(char *str)
{
    int Clen=0;   
    int B_num=0; 
    char *p1=str;
    char *p2=str;
    int newlength=0;
    int i=0;
    if(*str==NULL)
        return; 
    while(*p1!='\0')
    {
        p1++;
        Clen++;
        if(*p1==' ')
            ++B_num;
    }
     cout<<"Clen="<<Clen<<"B_num="<<B_num<<endl;
     newlength=Clen+B_num*2;
     cout<<newlength<<endl;
     p1=str+(Clen-1);
     p2=p2+(newlength-1);
     cout<<*p1<<endl;
     cout<<*p2<<endl;
    for(;p1!=p2;p1--,p2--)
    {
        if(*p1==' ')
        { *p2='0';
           p2--;
          *p2='2';
           p2--;
          *p2='%'; }  
        else
            *p2=*p1;
    }
    while(*str!=NULL)
        {cout<<*str;
         str++;
    }
}
int main()
{
    char str[100]="I love program";
    replaceBlank(str);
    return 0;
}

 



posted @ 2012-10-05 11:33  孙铭泽  Views(954)  Comments(1)    收藏  举报