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

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

  • 相关阅读:
    poj 2528 Mayor's posters (线段树+离散化)
    poj 1201 Intervals (差分约束)
    hdu 4109 Instrction Arrangement (差分约束)
    poj 1195 Mobile phones (二维 树状数组)
    poj 2983 Is the Information Reliable? (差分约束)
    树状数组 讲解
    poj 2828 Buy Tickets (线段树)
    hdu 1166 敌兵布阵 (树状数组)
    Ubuntu网络配置
    Button控制窗体变量(开关控制灯的状态)
  • 原文地址:https://www.cnblogs.com/ttzz/p/13736814.html
Copyright © 2011-2022 走看看