码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer:替换空格

时间:2015-07-13 20:22:53      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:

##题目:请实现一个函数,把字符串中的每个空格替换成%20。例如输入“We are happy.",则输出”We%20are%20happy."。

最容易想到的是,从头到尾扫描,每次碰到空格就替换。但是时间复杂度为o(n2)。

时间复杂度为o(n)的解法是:
首先遍历字符串,统计出字符串中空格的总数,然后计算出替换之后的字符串的总长度。然后准备2个指针,P1,P2,。P1,指向原串的末尾,P2指向新串的末尾。然后向前移动,逐个把P1指向的字符复制到P2指向的位置,遇到空格,就让P1向前移动,P2插入字符串%20,然后把P2向前移动3格。
    1. /*length 为字符数组string的总容量*/
    2. void ReplaceBlank(char string[], int length)
    3. {
    4. if(string == NULL && length <= 0)
    5. return;
    6. /*originalLength 为字符串string的实际长度*/
    7. int originalLength = 0;
    8. int numberOfBlank = 0;
    9. int i = 0;
    10. while(string[i] != \0)
    11. {
    12. ++ originalLength;
    13. if(string[i] == )
    14. ++ numberOfBlank;
    15. ++ i;
    16. }
    17. /*newLength 为把空格替换成‘%20‘之后的长度*/
    18. int newLength = originalLength + numberOfBlank * 2;
    19. if(newLength > length)
    20. return;
    21. int indexOfOriginal = originalLength;
    22. int indexOfNew = newLength;
    23. while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
    24. {
    25. if(string[indexOfOriginal] == )
    26. {
    27. string[indexOfNew --] = 0;
    28. string[indexOfNew --] = 2;
    29. string[indexOfNew --] = ‘%‘;
    30. }
    31. else
    32. {
    33. string[indexOfNew --] = string[indexOfOriginal];
    34. }
    35. -- indexOfOriginal;
    36. }
    37. }

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




剑指offer:替换空格

标签:

原文地址:http://www.cnblogs.com/zhuzhenfeng/p/4643448.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!