剑指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 可以保证程序正常运行,并防止遍历越界。