题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%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] != '\0'){
            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--] = '%';
            }
        }
    }
};

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

posted on 2020-09-26 21:18  曹婷婷  阅读(127)  评论(0编辑  收藏  举报