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

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

  • 相关阅读:
    Visual Studio 中的Code Snippet(代码片段)功能介绍
    对 FID 的解释
    感性负载和二极管保护
    二极管信号检波器
    java如何自动设置数据库自增长编号
    JDK1.8遍历方式
    转载:windows查看进程端口号
    发布订阅:分发代理无法在C:Program FilesMicrosoft SQL Server120COM 目录中创建临时文件
    confluence搭建wiki
    Hadoop集群安装(centos7.5+ambari-2.7.4.0部署安装)
  • 原文地址:https://www.cnblogs.com/ttzz/p/13736814.html
Copyright © 2020-2023  润新知