python 解决lintcode a+b 超时问题
题目描述
lintcode a+b 问题
题目来源及自己的思路
https://www.lintcode.com/prob...
代码
def aplusb(self, a, b):
# write your code here
while True:
a, b = a^b, (a&b)<<1
if a==0 or b == 0:
return a or b
当 a=-b 时 为什么代码会超时, 而同样的逻辑,用Java就不会超时
public int aplusb(int a ,int b) {
// write your code here, try to do it without arithmetic operators.
while(true){
int x = a^b; //记录不进位数
int y = (a&b)<<1; //记录进位数
if(x==0){
return y;
}
if (y==0){
return x;
}
a=x;
b=y;
} // while
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
原码、反码和补码
咱
整形数据
以八位二进制
为例那用整数
5
举个例子吧:而补码就是负数在计算机中的二进制表示方法
移位操作
<<
和>>
简单的说就是向左或向右移动指定的位数, 空缺用0或1来补, 溢出的部分将被舍弃回到题中
1.计算
a^b
(以+5、-5为例
)而
a
和-a
进行异或操作得到
1111 1110
也就是
-2
2.计算
(a&b)<<1
(以+5、-5为例
)而
a
和b
进行"与"操作得到
0000 0001
再左移一位
得到
0000 0010
也就是
2
3.So
你可以看到,
"任意"
一组相反数, 运行一次循环都会得到另一组相反数So, 这一组
相反数
再运行一次, 得到另一组相反数......So无限循环下去当然会超时了
你可以在代码中加上如果a, b的绝对值相等, 则直接等于0
其实还是有一定规律的, 我不想探究了(捂脸)
加上print(a, b), 自己看吧