您的位置:首页 > 其它

leetocode371 Sum of Two Integers

2016-07-01 12:26 441 查看
Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

Example:

Given a = 1 and b = 2, return 3.

写一个渣版本

首先判断结果的符号(+,-)

分别有以下几种:

-9,7 结果<0

-9,-9 结果<0

7,9 结果>0

9,-7 结果>0

这里的符号判断用signfunc() and calsign()来实现,返回结果符号和取绝对值的a,b

同号相加的方式(9+7)

这里用到了一个半加法的思想, 即两位单独的位相加其结果可以用异或(^)得到, 进位可以用与(&)得到. 然后对于两个数字来说同样可以延伸这个思想.

异号相加的方式(-9+7)

异号相加实际上是两数相减,研究发现(9^7)=14

1001

0111

——

1110

(-14)取反是13

1…1110

————

0…1101

对有意义的位再取反即得到结果

0…1101

————

0….0010

class Solution(object):
def signfunc(self,a):
if a>0:
return 1,a
elif a<0:
return 2,-a
else:
return 0,0
def calsign(self, a, b):
flagmatrix=[[0,1,-1],[1,1,0],[-1,0,-1]]
flaga,a1=self.signfunc(a)
flagb,b1=self.signfunc(b)
if a1>b1:
flagmatrix[2][1]=-1
flagmatrix[1][2]=1
else:
flagmatrix[2][1]=1
flagmatrix[1][2]=-1
return flagmatrix[flaga][flagb],a1,b1
def getSum(self, a, b):
"""
:type a: int
:type b: int
:rtype: int
"""
if a*b>=0:
flag,a,b=self.calsign(a,b)
while(b):
carry=a&b
a=a^b
b=carry<<1
return flag*a
else:
tmp=~(-(abs(a)^abs(b)))
flag,a,b=self.calsign(a,b)
if a==b:
return 0
ans=[]
while(tmp):
ans.append('%s'%((tmp%2)^1))
tmp=tmp/2
ans.reverse()
return flag*int(''.join(ans),2)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: