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--] = '%';
                }
            }
        }
    };

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

  • 相关阅读:
    png图片透明在ie6中显示问题
    DIV背景图片在Firefox下不显示,IE下正常
    整理:兼容 IE、Firefox、Opera和Safari
    IE6背景消失问题
    鼠标悬停换图片或背景
    网站团队组建方案
    CSS兼容IE6,IE7,FF的技巧
    打造MySQL版的最新IP数据库
    域名判断后跳转——PHP跳转代码_ASP跳转代码_JS跳转代码
    IE6文字消失、背景圖消失之謎
  • 原文地址:https://www.cnblogs.com/ttzz/p/13736814.html
Copyright © 2011-2022 走看看