栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

一、问题描述

数组下标访问越界。

错误的代码:

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/867557.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号