zoukankan      html  css  js  c++  java
  • 我们都遇到过的 Replace Blank Space

    题目描述:

    请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

    分析:
      看到这个题目,我们都会有一个比较直观的加法,那就是遍历字符串,每当遇到空格,就在当前位置插入“%20”,当前位置的字符往后移动三个位置。接着继续遍历,直到字符串结束。这个解法简单容易理解,但是直观的解法往往是效率比较低的,不难看出这个算法的时间复杂度是O(n^2).

      
      那么接下来就来看一下时间复杂度为O(n)的算法。不难看出无论什么算法都得遍历一遍整个字符串,那么既然从前往后遍历字符串效率低,那么我们就从后面往前遍历又会如何呢?这个算法需要两次遍历字符串。第一次从前往后遍历字符串,统计字符串中空格的次数。然后计算出把空格替换成“%20”后的字符串长度。然后就进行第二次遍历字符串,准备两个指针p1、p2,p1指向替换前字符串的末尾,p2指向替换后字符串的末尾,然后往前开始遍历数组,逐个把p1指向的字符复制到p2指向的地址。当遇到p1遇到空格时,p1向前移动一步,在p2前面插入三个字符“%20”,p2向前移动三步,接着又开始一步一步往前遍历替换,遇到空格时执行前面同样的操作。直到遍历结束。
      
      如果我说得不是很清楚,请看实现代码吧!

    C++实现:

     1 class ReplaceBlankSpace {
     2 public:
     3     void replaceSpace(char *str,int length) {
     4         int spaceNum = 0;
     5         int origin = length - 1;
     6         int end = 0;
     7         for (int i = 0; i < length; i++)
     8     {
     9             if (str[i] == ' ')
    10       {
    11                 spaceNum++;
    12       }
    13     }
    14 
    15         int afterLength = length + spaceNum * 2 - 1 ;
    16         end = afterLength;
    17         for (int i = length - 1 ; i >= 0 ; i -- )
    18     {
    19             if (str[i] == ' ')
    20       {
    21                 str[afterLength] = '0';
    22                 str[afterLength -1] = '2';
    23                 str[afterLength -2] = '%';
    24                 afterLength -= 3;
    25       }
    26             else
    27       {
    28                 str[afterLength] = str[i];
    29                 afterLength --;
    30       }
    31     }
    32 
    33   }
    34 };

    总结:

      直观的算法之所以效率低,是因为需要多次重复移动空格后面的字符。而第二种算法从后面遍历字符串就避免的多次重复移动字符,所有字符串都只复制移动了一次,所以时间复杂度是O(n),从而提高了效率。

      以此类推,如果我们遇到的的算法题,从前往后遍历需要多次重复复制移动元素,那么久可以考虑一下,是否可以从后往前遍历,减少复制移动的次数,从而提高效率。

  • 相关阅读:
    向存储过程中传入列表参数
    TRUNCATE TABLE (Transact-SQL)
    Program.cs
    联想G40-30 安装win10系统
    完美解决github访问速度慢[转]
    关于Visual studio 2017安装方法的若干问题
    [转载] 中国象棋软件-引擎实现(七)测试程序
    [转载] 中国象棋软件-引擎实现(六)局面评估
    [转载] 中国象棋软件-引擎实现(五)历史启发及着法排序
    [转载] 中国象棋软件-引擎实现(四)搜索算法
  • 原文地址:https://www.cnblogs.com/lrh-xl/p/5265413.html
Copyright © 2011-2022 走看看