您的位置:首页 > 职场人生

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

2015-07-21 10:56 465 查看
题目:请实现一个函数,把字符串中的每个空格都替换成"%20"。例如输入"We are happy."

则输出"We%20are%20happy."

这道题一看到就能想到直接从前到后遍历字符串,当遇到空格时候先将空格后面的字符串中每个

字符向后移动两个位置,然后再把空格及空格之后的两个字符替换为"%20"

剑指Offer书上这样说到:假设字符串长度为n,每遇到一个空格,需要移动后面的O(n)个字符,

那么对于n个空格来说算法时间复杂度为O(n*n),显然,时间复杂度为平方的方法算不上好

方法,那么有没有更好的方法呢?

剑指offer上提供了一种时间复杂度为O(n)的算法:

1.首先计算字符串中空格的个数。每个空格用三个字符替换,那么每多一个空格那么替换后的

字符串将多出来两个字符。因此计算出替换后字符串的长度。

2.在字符串中设置两个索引,p1索引指向字符串的结尾即'\0'处,另外一个指向计算出的

替换后字符串长度的位置。

3.当未遇到空格时候,将p1所指的字符赋值为p2所指的字符。同时索引p1,p2均向前移动一个

位置

4,当索引p1遇到空格时候将p2,p2-1,p2-2,这三个位置分别替换为'%' '2' '0',然后索引p1向前移动

一个位置,p2向前移动三个位置。

5.替换的结束条件是,当p1和p2索引位置相同时,这时候替换空格结束。

那么通过这么详尽的算法描述,这一题的解答为:



#include <iostream>
using namespace std;

void ReplaceBlank(char string[],int length)
{
int blankcount=0;
int i=0;
int len;
len=strlen(string);

while(string[i]!='\0')
{
if(string[i]==' ')
blankcount++;
string++;
}

int LenAfter;
LenAfter=strlen(string)+blankcount*2;

int p1,p2;

p1=len;
p2=len+LenAfter;
while(p1!=p2)
{
if(string[p1]!=' ')
{

string[p2]=string[p1];
p1--;
p2--;
}
else
{
string[p2--]='0';
string[p2--]='2';
string[p2--]='%';
p1--;
}
}
}

int main()
{
char string[50]="We are Happy.";
ReplaceBlank(string,50);
cout<<"The Replaced Blank string is "<<string<<endl;

return 0;
}


截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: