前提
刷题已经开始了,希望通过记笔记的方式来帮助自己理清思路,同时方便后续复习。同时也希望通过这种方式能帮助到一些同样在刷题的朋友。
知识点总结
主要使用的知识点:计算机的计算方式;补码反码;数据类型溢出问题;二进制左右移运算的运用(位运算);时间优化问题;
主要难点
-
为什么会越界?越界怎么处理
计算机的减法是用补码进行运算的。具体参考下面补码的知识。对于int的32位,其数值范围为2^31-1—— -2^31 .当算法中出现了abs(-2^31) 就会有越界问题,因为C++中abs( -2^31 )= 2^31 越界了,一般计算机会让其等于-2^31。和我们认知不同。在写程序的时候就会出错。补码的知识
以时钟为列 假设当前时针指向8点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨2小时,即8-2=6;另一种是顺拨10小时,8+10=12+6=6,即8-2=8+10=8+12-2(mod 12).在12为模的系统里,加10和减2效果是一样的,因此凡是减2运算,都可以用加10来代替。若用一般公式可表示为:a-b=a-b+mod=a+mod-b。即任何有模的计量器,均可化减法为加法运算 。就是取反后加1。
-
为什么需要时间优化?
当时间复杂度超过10^8时候,运行速度就会大大减低。这里对于int的最大数 2147483647每次减1需要循环2147483647>10^8次。所以采用移位的方式优化,并这种方法具有一般性,用代码容易提炼。如下所示。