Coders confess编程常见错误反思
Code confess
-
边界搞错了: 可能是等号,也可能是≥ 或≤;
-
比较关系写反了:大于、小于搞错,一般是把两边的式子错误调换导致的。
-
要求值的对象和其中关联的变量都要变更。 有的是关联变量变更后才需要改变求职,有的是求值后才需要改变结果。注意两种情况都可能存在。 例如 3 sum smaller中,
result = right - left; left+=1
-
变量引用错误。有的值定义了但实际没使用(错误使用了其他变量)。这样一到IDE就能立马发现。
-
注意:变量赋值和预想的不一样
Ruby expression is not assign right at first, check the following example: Cautious!
3.1.0 :001 > a=[0]*5 => [0, 0, 0, 0, 0] 3.1.0 :002 > i=2 => 2 3.1.0 :003 > a[i/=2]=i+10 # NOTICE HERE => 11
-
错误警示:原意是给未改变的
@nums[index]
赋值(因为i = index + 1),但实际赋值给了改变后的i-1
。def update(index, val) i = index + 1 delta = val - @nums[i - 1] while i < @bit.size @bit[i] += delta i += i & -i end @nums[i - 1] = val # 警告 end
-
连续大小关系的比较,符号朝向要一致。 例如要判断A < B < C, 要写成
A < B && B < C
, 不要混合使用>
和<
。 -
关系比较时,不要漏掉是否可以相等的条件。例如 rotated array binary search, 以右区间连续且值在右区间为例, 条件为
nums[m] < target && target <= nums[right - 1]
。这里漏掉等号则会错过值在右端点以内的例子。例如nums[10..14] = [1,1,1,2,1]。