4 - 替换空格

题目描述:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
例如:输入:s = “We are happy.” 输出:“We%20are%20happy.”

我们首先需要问清楚面试官的需求,假设让我们在原来的字符串上进行替换,并且保证输入的字符串后面有足够多的空间。

思路:

  • 可以先遍历一次字符串,这样就能统计出字符串中空格的总数,并且可以由此计算出替换之后字符串的总长度。
  • 然后从字符串后面开始复制和替换。首先准备两个指针p1和p2,p1指向原字符串末尾,p2指向替换之后字符串末尾,接下来移动p1指针,逐个把它指向的字符复制到p2指向的位置,直到碰到第一个空格为止。碰到第一个空格之后,把p1向前移动一格,在p2之前插入字符串"%20"。由于"%20"的长度为3,同时也要把p2向前移动3格。
  • 然后继续向前移动重复第二步,直到p1和p2指向同一位置,表明所有空格都已经替换完毕。

所有字符串都只需要复制(移动)一次,因此时间复杂度是O(n)。

代码实现:

class Solution {
    
    
public:
    string replaceSpace(string s) {
    
    
        int i = s.size() - 1;
        int num = 0;
        for(char ch : s)
        {
    
    
            if(ch == ' ')
                num++;
        }
        s.resize(s.size() + num*2);
        int j = s.size() - 1;
        while(i != j)
        {
    
    
            if(s[i] != ' ')
            {
    
    
                s[j--] = s[i--];
            }
            else
            {
    
    
                s[j--] = '0';
                s[j--] = '2';
                s[j--] = '%';
                i--;
            }
        }
        return s;
    }
};

同理在合并两个数组时也可以从后往前复制,这样就能减少移动的次数,从而提高效率。

猜你喜欢

转载自blog.csdn.net/qq_41721746/article/details/124026429