菜狗编程——第一期

前言

如题所示,本菜狗是ME转专业ing的程序猿,犹记得大二那年C语言的学习让我兴奋不已并一举拿下全班最高分,却未曾有勇气踏出专业半步,如今也算了却心愿,自当奋进努力。

本人的基础和各位大佬比起来可谓天地之别,但仍怀一颗上进之心,望能步大佬后尘也是好的。

在此写下个人学习的一点心得,望大家多多喷我,让我明白我的“菜点”的同时,也能让其他小白看到后少犯错误。前路漫漫,相互陪伴。

第一期——Leetcode 45 error

在我重温C语言之后,并自学数据结构过程之中,我打开了Leetcode大门……

Tips:这里建议刚刚入门的同学像我一样,从leetcode的「探索」专题开始做起(在首页最上面菜单栏),探索专题分成一个个小知识模块并附带几道难度低/中的算法题,小怪们有强有弱,算是新手村的Boss。

本次重点想说的,可能是新手们入门最常遇到的一个报错,heap-buffer-overfolw——堆溢出
堆溢出
其实,不只是堆,报错有着各种各样的溢出,同类下常见的几种报错有且不局限于如下几种:

各种溢出
Tips:本期重点聚焦heap buffer overflow,关于以上其他类别的常见错误及其解决方法均在CSDN上《【C语言刷LeetCode】Address Sanitizer 常见报错》(作者kinbo88)的文章里介绍了。

而我重点要说的是,如果你检查、修正了上述文章里的情况后,依旧有用力无法通过,该怎么办?

结论

这里先告诉大家结论:检查你指针指向数组的应用是否多余

具体问题具体分析

我遇到堆溢出是在“零矩阵”问题下,题目如下图所示:
探索->数组->零矩阵

这里附上我的代码:

void setZeroes(int** matrix, int matrixSize, int* matrixColSize){
int a[64];
int b[64];
int i,j,m=0,n=0;
int u,v;
for (i=0;i<matrixSize;i++){   //扫描行
    for(j=0;j<*matrixColSize;j++){      //扫描列
        if (matrix[i][j]==0){    //如果发现该元素为0,将其坐标存储
            a[m]=*matrix[i];
            m++;
            b[n]=*matrix[j];
            n++;
        }
    }
}
//所有0所在列元素置零
for (u=0;u<m;u++){
    for (j=0;j<*matrixColSize;j++){
        matrix[a[u]][j]=0;
    }
}
//所有0所在行元素置零
for (v=0;v<n;v++){
    for (i=0;i<matrixSize;i++){
        matrix [i][b[v]]=0;
    }
}
return matrix;
}

我想根据上面的注释,各位应该看的八九不离十,这里只说一下我之所以在判断0元素后将该元素的坐标i和j分开来存是因为:

其一,矩阵并不总是方阵,分开来存调用方便;
其二,二维数组我不熟,嘿嘿。后面matrix置零步骤下,二维数组就麻烦了。

眼尖的小伙伴可能已经看到了,问题就出在将0元素坐标存储的过程里:

a[m]=*matrix[i];
m++;
b[n]=*matrix[j];
n++;

思路是对的,BUT!要存储的是i和j本身的值,像我这么干,存储的就是matrix矩阵第i行和第j行的元素了。

是不是觉得挺弱智的问题?
但真的陷入自己的怪圈,很难去发现这个问题(只是我菜罢了)。

修改之后,果然神清气爽,用例OK,接下来还有一个需要注意的问题是如下报错:

这个才是真正的数组定义的空间不够用了

问题症结

到这里的报错就应该知道了,如果真的是因为数组溢出导致提交失败,报错应该是这个才对。

而之前的报错“----45----ERROR……”根本不是你定义出问题,而是程序内部使用出了问题

这里不得不感叹用例是真的多,元素也是真的多,于是作出如下修改:

int a[1000];
int b[1000];

如此这般,就美滋滋的提交吧~~

还行哈

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值