剑指Offer 替换空格

牛客 题目跳转链接

代码随想录 双指针解法

时间复杂度:O(n) 空间复杂度:O(1)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    string replaceSpace(string s) 
    {
        int count=0;
        int sOldSize=s.size();
        for(int i=0;i<sOldSize;i++)
        {
            if(s[i]==' ')
            count++;
        }
    //  扩容
        int sNewSize=sOldSize+count*2;
        s.resize(sNewSize);

        for(int i=sNewSize-1,j=sOldSize-1;j<i;i--,j--)
        {
            if(s[j]!=' ')
            { s[i]=s[j];}
            else
             { s[i]='0';
             s[i-1]='2';
             s[i-2]='%';
            i-=2;
            }
        }
        return s;

    }
};

这其中 for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) 为什么要用j<i作为判断条件呢?

A: 在这个循环中,我们要将原字符串中的空格替换为"%20",并将替换后的字符放在扩充后的字符串中,从后向前遍历字符串可以确保每个字符只会被移动一次,从而减少时间复杂度。

由于扩充后的字符串比原字符串要长,因此我们需要从后向前遍历字符串进行替换,同时还要保证不越界。循环条件 j < i 就是为了保证遍历不越界。

具体来说,i 从 sNewSize - 1 开始向前遍历,j 从 sOldSize - 1 开始向前遍历,j 表示原字符串的下标,i 表示扩充后字符串的下标,当 j 和 i 相等时,说明已经将所有的字符都替换完成,因此遍历可以停止。如果条件为 j <= i,当 j 和 i 相等时,仍然需要继续进行替换,导致遍历越界。

总之,循环条件 j < i 可以保证程序正常运行,并防止遍历越界。

posted @ 2023-03-19 12:58  专心Coding的程侠  阅读(9)  评论(0编辑  收藏  举报