📣 独立日限时特惠: VIP通行证立减$68
查看: 13091| 回复: 22
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Java/C#] 谈谈常见bug和良好的编程习惯

   
全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 Falldawn 于 2021-5-21 02:51 编辑

这些都是我的总结,原创不易,请大家多多加米,如何加米? 我这个楼的下方有“收藏”“评分”“淘贴”,请选择“评分”加米,多谢!

  • Sanity Check,没有对输入进行检查。通常Leetcode都会给出具体的输入范围,但是其他网站或者工作中可没有,所以机会对于任何程序,我都把coner case和base case写全,比如42. Trapping Rain Water,我写的就的就是
    1. if (height == null || height.length < 3) {
    2. return 0;
    3. }
    复制代码
    比如让你找k个最接近的值,这个k的取值范围一定要注意,如果k >= n,那就没必要再找了。比如让你找第k个最大值或者最小值,那就直接把k = 1和k = n - 1的结果作为base case返回。这样的好处是后面处理会更少bug也会更快一点,尤其是DP题目的时候,有时候你定义dp[] = new int[n],不是小1号的array,最后返回结果是dp[n - 1],那如果输入是长度为0的数组,岂不是Index Out of Bound了。
  • Index Out of Boud,在while循环并且i++或i--的时候,一定要注意写成while (i < n && A == A[i - 1])和while (i >= 0 && A[i] == A[i + 1]),就是必须要先检查index是否越界。[/i]
  • Null Pointer Exception,在操作链表和数的时候也就是在dereference的时候,具体来说就是node.right, node.left, node.next,在加 ”.” 的时候一定要保证node != null,否则就可能Null Pointer Exception
  • Overflow,尤其是加减乘除的操作,最常见的是写Comparator,我个人从来不写return -1, 0 或1也从来不写a - b。我全部调用Integer.compare(a, b)或者自然序的a.compareTo(b),简单清晰只要一行代码,没有overflow问题。这里调用参数的顺序和定义的顺序一致就是升序,否则就是降序。
    1. PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> Integer.compare(b, a)); // This is to call the Integer function so only works for int and Integer.
    2. PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b.compareTo(a));// This is to call the natural order which is implemented by the default Comparable method. Can only be used if there is a default Comparable method.
    复制代码

  • for/while 循环的条件一定要是正确的,如果在循环内部对输入进行了操作,就一定要注意在循环的条件一定是提前把输入的size取出来,比如在BFS过程中可以这么写
    1. int size = queue.size();
    复制代码
    也可以这么写
    1. for (int size = queue.size(); size > 0; size--)
    复制代码
    绝对不可以写下面这样,这一点千万注意,因为queue在发生变化
    1. for (int i = 0; i < queue.size(); i++)
    复制代码

  • for 循环内部有while循环时,一定要注意不要重复++和--,比如已经是
    1. for (int i = 0; i < n; i++)
    复制代码
    这时如果内部有while循环,一定主要不要重复操作i。如果怕出错,那可以写成这样,这其实就是while循环了,只不过只需要一行。如果循环外内部需要i,那就把i提前声明出来,那样就完全是while循环了。
    1. for (int i = 0; i < n; )
    复制代码

  • Java中如果需要copy数组之类的Object,一定要deep copy,否则所有copy的都是地址,任何操作都改变原Object。对于backtrack求所有解的情况,如果解是object type一定要deep copy!!!
  • == 对于Object来说比较的是地址,对于primitive type比较的是值,所以对于Object比较内容一定要用equals尤其是String。所以在写一个新的Comparator时,一般要注意可能要overwrite hashCode。这里要注意如果是List<Integer>,比较的时候不能用==,必须用equals。
  • 有时候需要把二维数组的index = [i,j] 写一个class封装进去,但是这样麻烦的是要overwrite hashCode判断2个index是否一样。简单的办法就是把二维数组转换成一维数组的index,这样就不需要新建class也就避免overwrite hashCode了,index = i * n + j,反过来 i = index / n, j = index % n
  • Java传参只有pass by value。如果是primitive type比如int a= 5,则传入的是这个a 的copy,等于是再copy出一个数5传入函数中,函数执行完根本不改变a的值,一顿操作猛如虎一看战绩零杠五。而如果是Object,则传入的是Object的地址的copy,所以在此地址上作出的改变都改变了Object的内容。
  • Java中返回多个值:如果类型相同,则用一个array即可;如果类型不同,建一个class把所有值作为field封装进去。
  • copy自己或者别人的代码时,一定要注意把所有要修改的全部修改,我经常犯的错误是copy了一个fori循环,结果i忘了改成j,或者i的范围忘了改成j的范围,等等……
  • 不要省略{},即使只有一行,因为后续如果添加修改代码很难debug出来






补充内容 (2021-05-21 06:24 +8:00):
今天刚出了一个bug,更新全局max时,因为有3个值要比较,结果第一步没有把max放进去,后面结果错误

评分

参与人数 86大米 +215 收起 理由
月饼与明月 + 3 给你点个赞!
pigmm1995 + 1 谢谢分享!
hopestarta + 1 给你点个赞!
cdlttg + 1 给你点个赞!
小倪同学 + 1 很有用的信息!

查看全部评分


上一篇:转码新手某刷题产品体验分享
下一篇:Python里面用什么数据结构代替TreeMap / OrderedMap
推荐
cn_goku 2021-5-21 04:02:28 | 只看该作者
全局:
教你们一行神奇代码解决bug:
  1. #define mian main
复制代码
回复

使用道具 举报

推荐
 楼主| Falldawn 2021-5-21 06:48:48 | 只看该作者
全局:
springbear 发表于 2021-5-21 05:55
赞,楼主写的都是看似很小的点,却能避免很多错误,面试时考虑到时间有限,用良好习惯避免无谓的bug至关重 ...

多谢多谢!细节决定成败,真得,有时候1个字符的错误会耗费一个晚上。飞机翅膀断了油箱漏油谁都能看出来,也就是大问题傻子都能看出来,但是一个螺丝少了或者松了就造成巨大的灾难。

评分

参与人数 1大米 +3 收起 理由
5919393 + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

推荐
 楼主| Falldawn 2021-5-22 02:44:45 | 只看该作者
全局:
bbbnnn777 发表于 2021-5-22 01:55
谢谢楼主分享,说得很详细啊
不过第二点“while (i < n && A == A)和while (i >= 0 && A == A)”,是不是 ...

我只是举个例子,具体怎么写看具体应用,不必在意我这个写的
回复

使用道具 举报

🔗
 楼主| Falldawn 2021-5-21 04:04:01 | 只看该作者
全局:
cn_goku 发表于 2021-5-21 04:02
教你们一行神奇代码解决bug:

哈哈哈,这是经常写错main是吧
回复

使用道具 举报

🔗
vvqqdd 2021-5-21 04:57:47 | 只看该作者
全局:
古城群里的大佬 牛逼
回复

使用道具 举报

全局:
赞,楼主写的都是看似很小的点,却能避免很多错误,面试时考虑到时间有限,用良好习惯避免无谓的bug至关重要。
回复

使用道具 举报

🔗
totolin 2021-5-21 10:25:10 | 只看该作者
全局:
太好了谢谢分享
回复

使用道具 举报

🔗
wilbur_zzz 2021-5-21 14:35:38 | 只看该作者
全局:
cn_goku 发表于 2021-5-21 04:02
教你们一行神奇代码解决bug:
  1. #define defien define
复制代码


我想起来了这个
回复

使用道具 举报

🔗
windlion 2021-5-21 16:28:21 | 只看该作者
全局:
谢谢,很多都是刷题中经常碰见的小问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表