
数组下标访问越界。
错误的代码:
//双定位变量
int p0 = 0,p1 = 0;
//遍历计数器
int i;
for(i = 0;i < nums.size();++i)
{
if(nums[i] == 0)
{
swap(nums[i],nums[p0]);
if(p0 < p1) swap(nums[i],nums[p1]);
++p0;
++p1;
}
if(nums[i] == 1)
{
swap(nums[i],nums[p1]);
++p1;
}
}
正确的代码:
//双定位变量
int p0 = 0,p1 = 0;
//遍历计数器
int i;
for(i = 0;i < nums.size();++i)
{
if(nums[i] == 1)
{
swap(nums[i],nums[p1]);
++p1;
}
if(nums[i] == 0)
{
swap(nums[i],nums[p0]);
if(p0 < p1) swap(nums[i],nums[p1]);
++p0;
++p1;
}
}
正确与不正确就只是改变了一下两个 if 语句顺序。当时在纸上验算了很久都没查出问题。
二、解决问题测试样例:{1,0}
错误原因:最后一次循环
| i | 1 |
| nums[i] | 0 |
| p0 | 0 |
| p1 | 1 |
所以第一个 if 判断语句成立,执行语句 swap(nums[i],nums[p0]) 后
| i | 1 |
| nums[i] | 1 |
| p0 | 0 |
| p1 | 1 |
接着判断语句 p0 < p1 也为真,就会执行 swap(nums[i],nums[p1])
这里还没有问题,接着执行 ++p0; ++p1 就出错了,因为此时
| i | 1 |
| nums[i] | 1 |
| p0 | 1 |
| p1 | 2 |
可见,p1 此时为 2 ,由于后面还会执行第二个 if 判断语句 nums[i] == 1
判断为真,所以要执行 if 内的语句,也就是 swap(nums[i],nums[p1])
这时就出现了数组下标访问越界。
三、推荐一个比较好用的可视化算法网站以上调试就是在这个网站实现的,将你的代码粘贴上去就可以显示的看到整个算法执行过程了,非常好用,但是因为是免费的网站,所以只能调试一些小程序。
pythontutor
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)