• 剑指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. }

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




  • 相关阅读:
    MapKit 大头针基本使用
    iOS获取文件的大小
    iOS截取图片方法
    iOS通知3种使用方法
    iOS12适配及兼容问题解决,xcode10问题
    Mac不使用iTunes导出照片
    Xcode 10 项目迁移 Multiple commands produce...
    tableView在UITableViewStylePlain的状态下取消悬浮效果(取消粘性效果)
    OC 字符串和字典的相互转化
    破解 Mac OS管理员密码 亲测可用
  • 原文地址:https://www.cnblogs.com/zhuzhenfeng/p/4643448.html
Copyright © 2020-2023  润新知