算法系列——替换空格(剑指offer)

来源:互联网 发布:淘宝一键上传好不好 编辑:程序博客网 时间:2024/05/29 14:36

题目描述

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

解题思路

1.O(n)空间复杂度解法O(n)时间复杂度解法

创建一个新的字符序列,遍历原字符序列,遇到空格则在新的字符序列中加上%20,否则加上 字符本身。

2.O(1)空间复杂度 O(n)时间复杂度

在原来字符串上做操作,不申请新的空间。我们可以换下思路,
先统计出空格的个数num,那么新字符串的长度就是原来字符串长度len+num*2. 然后我们倒着遍历字符串,采用双指针法,一个指向原来字符串的末尾index1,一个指向新字符串的末尾index2。如果遇到非空格字符,那么直接将字符复制到index2处,然后index2–,如果index1指向了空格字符,那么index2出应该依次加入0,2,% 这三个字符,依次类推,直到遍历结束。

程序实现

1.O(n)空间复杂度解法O(n)时间复杂度解法

 /**    *O(n)时间复杂度 O(n)空间复杂度    */    public String replaceSpace1(StringBuffer str) {        if(str==null)            return null;        StringBuffer res=new StringBuffer();         for(int i=0;i<str.length();i++){             if(str.charAt(i)==' ')                 res.append("%20");             else                 res.append(str.charAt(i));         }        return res.toString();    }

2.O(1)空间复杂度 O(n)时间复杂度

 /**    *O(n)时间复杂度 O(1)空间复杂度    */    public String replaceSpace2(StringBuffer str) {        if(str==null)            return null;        //统计空格总数        int num=0;        for(int i=0;i<str.length();i++)            if(str.charAt(i)==' ')                num++;        int index1=str.length()-1;//指向原始字符串末尾        int index2=str.length()+num*2-1;//新字符串末尾        //设置新长度        str.setLength(index2+1);        for(int i=index1;i>=0;i--){            if(str.charAt(i)!=' ') {                str.setCharAt(index2, str.charAt(i));                index2--;            }else{                str.setCharAt(index2--, '0');                str.setCharAt(index2--, '2');                str.setCharAt(index2--, '%');            }        }        return str.toString();    }