我正在学习python,尝试解决以下问题。
计算两个整数A和B的和,但不允许使用运算符+和-。
例子:给定a=1和b=2,返回3。
我提出的以下解决方案适用于正整数,但如果a=-1和b=1,则不适用。
我想知道你如何处理负值。
class Solution(object):
def getSum(self, a, b):
"""
:type a: int
:type b: int
:rtype: int
"""
while b != 0:
carry = a&b
a= a^b
b= carry<<1
return a
你能用什么样的python操作符来作弊吗,或者你必须使用位操作符吗?
问题是什么?
如果你想成为一个时髦的sum((a, b))。
@它也适用于负数。当A&B有相反的标志时,它就不起作用了。
那我怎么能应付这种情况呢?
@miradulo,这个链接也只处理正整数。我的解也适用于正整数。
使用有符号整数进行计算需要固定的位长度。恐怕python不能保证这一点,但对其内部结构不太清楚。
@如果你的整数是32位,请看这个问题。
这个问题需要反复讨论吗?为什么不只是return a.__add__(b)呢?
@是什么让你这么想的?因为它们的格式都像leetcode解决方案?
@温泉:你能解释一下你是否需要使用钻头操作吗?如果没有,请随意接受ABCCD的回答,或者,如果这对你来说太"时髦",请接受我的回答。
在python中不使用"+"运算符的两个整数之和的可能重复;因为它实际上解决了问题。
如果您真的想学习python,有很多其他的方法可以找到两个数字的和。使用位运算符只能教会你所涉及的算法,而IMO并不是开始学习任何语言的好方法;因此,我的答案不会涉及任何位操作。
以下是不使用带有内置python功能的plus("+")运算符进行添加的许多方法:
a = 1
b = 2
# The"sassy" way as suggested by miradulo, uses the built in function `sum()`
print(sum((a, b)))
# uses a's __add__ magic method to add with b
print(a.__add__(b))
# similar to the previous, but directly uses int's __add__ instead
print(int.__add__(a, b))
# uses the add operator as a function, equivalent to `anything + anything`
from operator import add
print(add(a, b))
# they all return '3'
我明白了。不使用诸如sum()之类的内置函数的解决方案。首先定义一个不带-运算符的减法函数。然后你可以用它来解决问题。干得好!:
def getSum(a, b):
negative_number = None
if a == 0:
return b
elif b == 0:
return a
if a < 0 and b < 0:
pass
elif a < 0:
negative_number = a
elif b < 0:
negative_number = b
if (a < 0 and b < 0) and abs(a) == abs(b):
return int("-%s" % (str(getSum(abs(a), abs(b)))))
elif abs(a) == abs(b) and (a < 0 or b < 0):
return 0
elif negative_number != None:
x = getSum(abs(a), abs(b))
if x > 2*abs(negative_number):
return subtract(getSum(abs(a), abs(b)), 2*abs(negative_number))
else:
return subtract(2*abs(negative_number), getSum(abs(a), abs(b)))
while b != 0:
carry = a&b
a = a^b
b= carry<<1
return a
def subtract(x, y): #Subtraction function without - operator.
while (y != 0):
borrow = (~x) & y
x = x ^ y
y = borrow << 1
return x
print (getSum(-15, 16)) #Substitute -15 and 16 for any values to find the sum
号
现在尝试你想要的任何姿势。对于大多数数字来说,它都会很好地工作,除了一些我会攻击的角落案例,一旦我有了一个完整的解决方案,我就会发布它。
试试getSum(10, -100)怎么样。仍然破碎。
@米拉多洛,我不知道该怎么办。有什么帮助吗?
你可以把a < 0 or b < 0改写成negative_number != None。但最后,我认为这个答案现在是有效的。现在等着手术……
现在你要向abs传递两个参数。
@米拉多洛,你什么意思?
@BOI A括号问题:)
现在也试试getSum(-10, 100),不起作用。实际上,现在您的示例案例也不起作用。
@米拉杜洛是的,所以我向你求助。我不明白为什么OP不能只用+和-。使我们的生活更加艰难。:)
我将把这个答案保留在这里,因为我们几乎快要得到一个完整的解决方案了。同时,我会设法弄清楚的。@温泉看看这个。仍然有一些角落的情况需要解决,但它主要是工作。当我有一个完整的解决方案时,我会告诉你。如果您找到完整的解决方案,请随意编辑或评论。谢谢
@博伊,这不是一个真正的代码审查网站,但这个答案不起作用-我看不到它的价值。不管怎样,对于具有无限二的补码表示的Python,我怀疑您是否能够在不完全分离正负情况的情况下实现这一点。
@Miradulo完成了。找到了一个完整的解决方案。现在应该是真的了:)
@这里的温泉是完整的解决方案
@boi getSum(-1000, 0)是1000…
@米拉多洛哇。你很擅长在代码中发现错误:)我也修正了这个问题。
@为什么要谢谢你?现在,getSum(1, -1000)是999;)
@米拉多洛,神圣的莫里。此代码需要花费大量精力来修复;)
为了解决您的方法,您应该检查哪些值不起作用,并以某种方式捕获它们(例如,if a == -1 and b == 1)
编辑:正如boi和hotspring指出的,只有当a和b有不同的标志时,它才会失效。如果a<0 xor b<0,可以添加一个substract函数(见另一个答案),并将其用作Substract(a, -b)。
另一种可能的方法——缓慢但简单——可能是:
查看第二个操作数是否为负数。
如果不是(也就是说,如果b是正数),则递增a并递减b,直到b为零。
如果是(也就是说,如果b为负),则减小a并增加b,直到b为零。
当A和B有不同的符号时,它不会失效。请看我的答案。
正如温泉城指出的,这似乎是正确的。不管怎样,它在其他情况下肯定不会失败(我希望如此)。这种位操作在高级语言中是不应该做的。
请再看一下我的答案。
为什么我被否决?
@Xanoteux我不确定。也许它没有帮助手术,或者有人认为它没有帮助。我真的不知道。
我投了反对票,因为这个答案很不完整。"不知何故抓住他们?怎样?您的实现是什么样子的?同样,对于后一种方法,您打算如何在不使用+=或-=的情况下增加和减少?