题解 | #替换空格#

替换空格

http://www.nowcoder.com/practice/0e26e5551f2b489b9f58bc83aa4b6c68

解题思路1:从后往前来对有空格的地方插入'%20',首先查看字符串中空格出现的次数,然后对字符串进行扩容(在原字符串长度的基础上添加空格数✖2的长度),然后按照下面的操作来进行。(1)p1指向原来字符串的末尾,p2指向扩容之后字符串的末尾,即新字符串的末尾;(2)从p1开始,将对应位置的字符复制给p2,然后p1--,p2--直到遇到空格;(3)当遇到空格时,在p2位置依次插入'0','2','%'(因为我们是从后往前复制的),此时p2的位置向前移动了三位,不要忘记p1--;(4)当p1=0并且p1>p2时,结束循环,输出新的字符串。

时间复杂度:O(n),所有的字符串只复制了一次;

空间复杂度:O(1)

下面是基于C++实现的:

class Solution {
public:
    string replaceSpace(string s) {
        //如果是空字符串的情况
        if(s.empty()){
            return s;
        }
        
        int num_blank = 0;
        int i = 0;
        //计算空格的个数
        while(i < s.length()){
            if(s[i] == ' '){
                num_blank += 1;
            }
            i += 1;
        }
        //计算扩展之后的长度
        int new_length = s.length() + num_blank*2;
        //p1,p2分别指向原字符串的末尾和扩展之后新字符串的末尾
        int p1 = s.length();
        int p2 = new_length;
        //对原字符串进行扩容
        s.resize(new_length);
        //判断条件,p1要大于零,并且小于p2
        while(p1 >= 0 && p1 < p2){
            //如果原字符串出现空格,则添加%20,p2向前移动三位
            if(s[p1] == ' '){
                s[p2--] = '0';
                s[p2--] = '2';
                s[p2--] = '%';
            }else{
                //如果没有出现空格,就直接赋值,p2向前移动一位
                s[p2--] = s[p1];
            }
            //不管是不是空格,p1每次向前移动一位,p1的内容控制p2的移动次数
            --p1;
        }
        return s;
    }
};

解题思路2:使用栈,遇到空格就将'%20'入栈,不是空格就直接入栈,然后以字符串的形式返回即可。

时间复杂度:O(n)

空间复杂度:O(n)

下面是基于python实现的:

class Solution:
    def replaceSpace(self , s: str) -> str:
        stack = []
        for c in s:
            # 如果是空格,'%20'入栈
            if c == ' ':
                stack.append('%20')
            else:
                # 不是空格正常入栈
                stack.append(c)
        # 以字符串形式返回
        return ''.join(stack)

总结:在数组中需要复制移动数字的时候,也可以考虑从后往前复制,这样可以减少移动的次数,从而提高效率。

全部评论

相关推荐

一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
评论
4
收藏
分享
牛客网
牛客企业服务