题目描述:请实现一个函数,把字符串 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;
}
};
同理在合并两个数组时也可以从后往前复制,这样就能减少移动的次数,从而提高效率。