前言
本专栏汇总刷题过程中一些相似度极高的数道题的思考逻辑,欢迎大家指出宝贵意见!
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目大意
??给定两个整数a、b,求二者的商。 ??LC题目标号为:剑指Offer II 001. 整数除法 以及 29. 两数相除
补充题目要求:
- -2 ^ 31 <= a, b <= 2 ^ 31-1
- b != 0
- 结果溢出[-2 ^ 31, 2 ^ 31-1],返回 2 ^ 31-1(即:2147483647)
二、解题思路
1.二进制替代思想
??关键公式: ??a / b = 2 ^ i + ( a - b * 2 ^ i ) / b ??在编码中 2 ^ i 可以写成 1 << i 。
class Solution:
def divide(self, a: int, b: int) -> int:
if a == -2147483648 and b == -1:
return 2147483647
flag = 1 if (a>0)==(b>0) else 0
a,b,ans = abs(a),abs(b),0
for i in range(31,-1,-1):
# a/b = 2^i + (a-b*2^i)/b
if (b<<i) <= a:
ans += 1<<i
a -= b<<i
return ans if flag else -ans
三、总结
??这道题非常的典型,这里给出的编码也非常的简洁明了,对于flag的使用尤其需要注意,这样的判断方式节省了if的使用,同时左移运算符需要好好掌握一番,对于题意解读甚是有益。
|