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