码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode#29 Divide Two Integers

时间:2015-08-01 21:58:41      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:

Problem Definition:

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

Solution:就是要用加减和位操作之类的运算,来实现除法咯。

6/3=2的意思是,6里面包含了2个3。因为我们要做的,就是算出被除数dividend中包含了几个除数divisor。

最直接的想法:不断从dividend里减去divisor,直到dividend小于了divisor,用一个计数变量来统计一共完成了多少次减操作,得到的就是商。

存在的问题:

1)如果除数相对于被除数来说很小,就要进行好多次以上这种运算,很耗时。比如被除数是2147483647,而除数是1...;

2)要考虑符号问题,比如 -3 / 2,并不能直接使用上面的规则;

3)要处理overflow.

那么来解决上面的问题 one by one。

1)借用二分查找的思想,不断扩大(翻倍)divisor,这样能使得减的次数减少很多很多。翻倍可以靠左移操作来实现。注意计数变量增大的跨度也应该跟着翻倍

2)先确定符号,然后用两数的绝对值继续操作。最后再还原符号。

3)限定边界

 

代码:

 1     # @param {integer} dividend
 2     # @param {integer} divisor
 3     # @return {integer}
 4     def divide(self, dividend, divisor):
 5         pz=(dividend<0)==(divisor<0)
 6         dividend, divisor=abs(dividend), abs(divisor)
 7         result=0
 8     
 9         while dividend>=divisor:
10             subDvz, cnt=divisor, 1
11             while dividend>=subDvz:
12                 dividend-=subDvz
13                 result+=cnt
14                 subDvz<<=1
15                 cnt<<=1
16         if not pz:  #negative
17             result=-result
18         return min(max(-2147483648, result), 2147483647)

 

注:以上代码通过了OJ,但是其对除法操作的定义似乎跟Python不一致。用Python算-3/2,结果是-2,而以上代码会返回-1。Python采用的是向下(数轴负方向)取整。而本题定义的应当是向零取整。

 

LeetCode#29 Divide Two Integers

标签:

原文地址:http://www.cnblogs.com/acetseng/p/4694624.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!