剑指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 @   专心Coding的程侠  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示