美文网首页
874. “栏杆错误”——算法进阶必须跨越的门槛

874. “栏杆错误”——算法进阶必须跨越的门槛

作者: 七镜 | 来源:发表于2023-12-05 21:49 被阅读0次

    在所有常见的程序设计错误中,最难以察觉的一类是“栏杆错误”,也常被称为“差一错误”(off-by-one error)。七镜在程序设计中,最头疼的莫过于攻克算法了,一提起来,立马就是一把辛酸泪呀!

    先上两个通用原则:

    1. 首先考虑最简单情况下的特例,然后将得到的结果外推,这是原则一。
    2. 仔细计算边界,绝不掉以轻心,这是原则二。

    技术背景,这次就不提了,直接上编程技巧:

    一言以蔽之:用第一个入界点和第一个出界点来表示一个数值范围。具体而言,(以一个问题为引子:假定整数 x 满足边界条件 x >= 16 且 x<= 37,那么此范围内 x 的可能取值个数有多少?)我们不应说整数满足 x 满足边界条件 x>=16 且 x <= 37,而是说整数 x 满足边界条件 x >= 16 且 x < 38。注意,这里下界是“入界点”,即包括在取值范围之中;而上界是“出界点”,即不包括在取值范围之中。

    1. 取值范围的大小就是上界与下界之差。38 - 16 的值是 22,恰恰是不对称边界 16 和 38 之间所包括的所有元素数目。
    2. 如果取值范围为空,那么上界等于下界。这是第一条的直接推论。
    3. 即使取值范围为空,上界也永远不可能小于下界。

    附加:

    1. 将上界和下界转换为等效值。(比如:假定整数 x 满足边界条件 x >= 15.3 且 x <= 36.7,那么此范围内 x 的取值个数有多少?转换为 x >= 16 且 x < 37)
    2. 确定步长。(比如:100 英尺长的围栏每隔 10 英尺需要一根支撑用的栏杆,共需要多少根栏杆呢?这里步长就是10,即将原本 x >= 0 且 x<=100 转换为 110 / 10 - 0 这里之所以是 110 而不是 100 是因为 110 是下界等效值;如果题中给定的是 101 英尺长,那这里就是 120,因为 100 到 101 需要一根栏杆 等效于 100 到 110 需要一根栏杆。然后 110 加上步长 10,就等于 120 了。)

    相关文章

      网友评论

          本文标题:874. “栏杆错误”——算法进阶必须跨越的门槛

          本文链接:https://www.haomeiwen.com/subject/azudgdtx.html