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

    题目描述

    请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
     对于字符串的替换,最容易想到的是使用str的库函数replaceAll或者replace函数,
    class Solution {
        public String replaceSpace(String s) {
    
            return s.replaceAll(" ","%20");
        }
    }
     如果不考虑额外占用空间的话,可以使用如下方法,利用StringBuffer或者stringBuilder,避免了利用String进行拼接操作造成的内存的浪费
    class Solution {
        public String replaceSpace(String s) {
            StringBuffer str = new StringBuffer(s);
            for(int i=0;i<str.length();i++){
                if(str.charAt(i)==' '){
                    str.deleteCharAt(i);
                    str.insert(i,'%');
                    str.insert(++i,'2');
                    str.insert(++i,'0'); 
                }
            }
            return str.toString();
        }
    }

     上诉方法都太过简单,没有用到算法知识,剑指offer上提供了从后向前的一个思路:

    首先,最容易想到的方法是,遇到空格,则将其后面的每个字符依次向后移动两位,然后插入%20三个字符,但是这是时间复杂度为O(n^2)的方法,如何在O(n)的时间复杂度的情况下实现该算法?

    我们先计算原来字符串的长度以及空格的个数,那么替换后的字符串长度即为原来字符串长度+空格个数*2

    然后我们设置两个指针p1和p2,p1指向原来字符串的末尾,p2指向替换后字符串的末尾,从后往前扫描,如果p1所指位置不是空格,则将其值赋给p2所指位置,否则,在p2处移动3字符并插入%20.。p1每次向前移动一字符,直到达到字符串开头。

    class Solution {
    public:
        void replaceSpace(char *str,int length) {
            int i = 0;
            int blankNumber = 0;
            int originalLength = 0;
            while(str[i] != ''){
                originalLength++;
                if(str[i] == ' ')
                    blankNumber++;
                i++;
            }
            int updateLength = originalLength + 2*blankNumber;
            if(updateLength > length)
                return;
            
            for(i=originalLength;i>=0;i--){
                
                if(str[i]!=' '){
                    str[updateLength--] = str[i];
                }else{
                    str[updateLength--] = '0';
                    str[updateLength--] = '2';
                    str[updateLength--] = '%';
                }
            }
        }
    };

    从后往前的思想非常巧妙,需要在今后多加注意

  • 相关阅读:
    MT【126】点对个数两题之二【图论】
    MT【125】四点共圆
    MT【124】利用柯西求最值
    MT【123】利用第一次的技巧
    MT【122】一个重要的不平凡的无穷级数
    MT【121】耐克数列的估计
    MT【120】保三角函数
    MT【119】关于恒成立的一道压轴题
    计算机视觉目标检测的框架与过程
    使用模板类导致error LNK2019: 无法解析的外部符号
  • 原文地址:https://www.cnblogs.com/ttzz/p/13736814.html
Copyright © 2011-2022 走看看