python 解决lintcode a+b 超时问题

发布于 2022-09-11 17:45:51 字数 846 浏览 22 评论 0

题目描述

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无所谓啦 2022-09-18 17:45:51

原码、反码和补码

整形数据八位二进制为例
那用整数5举个例子吧:

  • 原码: 0000 0101
  • 反码: 1111 1010
  • 补码: 1111 1011

补码就是负数在计算机中的二进制表示方法

移位操作

<<>>简单的说就是向左或向右移动指定的位数, 空缺用0或1来补, 溢出的部分将被舍弃

回到题中

1.计算a^b(以+5、-5为例)

a-a进行异或操作
得到1111 1110
也就是-2

计算过程:
5(0000 0101)-5(1111 1011)为例
异或运算得到1111 1110
1111 1110 减去 1 得到 1111 1101
1111 1101 取反码 0000 0010 得到 2
2再加上原来的负号 就是 -2

2.计算(a&b)<<1(以+5、-5为例)

ab进行"与"操作
得到0000 0001
左移一位
得到0000 0010
也就是2

计算过程:
同样以5(0000 0101)-5(1111 1011)为例
"与"
得到0000 0001
左移一位
得到0000 0010
也就是2

3.So

你可以看到, "任意"一组相反数, 运行一次循环都会得到另一组相反数
So, 这一组相反数再运行一次, 得到另一组相反数......

So无限循环下去当然会超时了
你可以在代码中加上如果a, b的绝对值相等, 则直接等于0
其实还是有一定规律的, 我不想探究了(捂脸)
clipboard.png

加上print(a, b), 自己看吧
clipboard.png

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文