您的位置:首页 > Web前端

剑指offer:替换空格

2015-07-13 17:29 169 查看
##题目:请实现一个函数,把字符串中的每个空格替换成%20。例如输入“We are happy.",则输出”We%20are%20happy."。
最容易想到的是,从头到尾扫描,每次碰到空格就替换。但是时间复杂度为o(n2)。
时间复杂度为o(n)的解法是:首先遍历字符串,统计出字符串中空格的总数,然后计算出替换之后的字符串的总长度。然后准备2个指针,P1,P2,。P1,指向原串的末尾,P2指向新串的末尾。然后向前移动,逐个把P1指向的字符复制到P2指向的位置,遇到空格,就让P1向前移动,P2插入字符串%20,然后把P2向前移动3格。
/*length 为字符数组string的总容量*/

void ReplaceBlank(char string[], int length)

{

if(string == NULL && length <= 0)

return;


/*originalLength 为字符串string的实际长度*/

int originalLength = 0;

int numberOfBlank = 0;

int i = 0;

while(string[i] != '\0')

{

++ originalLength;


if(string[i] == ' ')

++ numberOfBlank;


++ i;

}


/*newLength 为把空格替换成'%20'之后的长度*/

int newLength = originalLength + numberOfBlank * 2;

if(newLength > length)

return;


int indexOfOriginal = originalLength;

int indexOfNew = newLength;

while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)

{

if(string[indexOfOriginal] == ' ')

{

string[indexOfNew --] = '0';

string[indexOfNew --] = '2';

string[indexOfNew --] = '%';

}

else

{

string[indexOfNew --] = string[indexOfOriginal];

}


-- indexOfOriginal;

}

}

[/code]
合并两个数组的时候,如果从前往后复制的话,需要移动数字或字符多次,因此可以考虑从后往前复制。

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