zoukankan      html  css  js  c++  java
  • 剑指offer:替换空格

    ##题目:请实现一个函数,把字符串中的每个空格替换成%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] != '')
    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. }

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




  • 相关阅读:
    Tomcat 环境搭建
    Samba 3.6.9 安装、管理
    FTP vsftp 安装、管理
    FTP pure-ftpd 安装、管理
    NFS 安装、管理
    sql
    mysql Encryption and Compression Functions
    jQuery UI Layout Plug-in
    mysql存储过程、函数和触发器的创建 [转]
    bootstrap前端开发框架,未来发展趋势
  • 原文地址:https://www.cnblogs.com/zhuzhenfeng/p/4643448.html
Copyright © 2011-2022 走看看