力扣刷题记录(75c++)

力扣刷题记录(75c++),第1张

一、问题描述

数组下标访问越界。

错误的代码:

        //双定位变量
        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}

错误原因:最后一次循环 

i1
nums[i]0
p00
p11

所以第一个 if 判断语句成立,执行语句 swap(nums[i],nums[p0]) 后

i1
nums[i]1
p00
p11

接着判断语句 p0 < p1 也为真,就会执行 swap(nums[i],nums[p1])

这里还没有问题,接着执行     ++p0;     ++p1   就出错了,因为此时

i1
nums[i]1
p01
p12

 

可见,p1 此时为 2 ,由于后面还会执行第二个 if 判断语句 nums[i] == 1

判断为真,所以要执行 if 内的语句,也就是 swap(nums[i],nums[p1])

这时就出现了数组下标访问越界。

三、推荐一个比较好用的可视化算法网站

以上调试就是在这个网站实现的,将你的代码粘贴上去就可以显示的看到整个算法执行过程了,非常好用,但是因为是免费的网站,所以只能调试一些小程序。

 

pythontutor

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/875330.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-13
下一篇2022-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存