最近心里很烦躁,单位项目多,任务重,导师给的压力也很大,自己一个人在这边,心里总会不舒服吧,慢慢克服吧,还是希望自己能找到满意的工作。
说说这个笔试题,给一个字符串中的空格全部换成“%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;
}