• Leetcode 371


    我们先用最朴素的方法来思考这道题,那就是逐位进行运算。

    bit[i] = a[i] + b[i] + carry[i]

    if a[i] + b[i] + carry[i] >= 10: carry[i+1] = 1

    但是我们不能使用加法,也没有加法器元件,因此我们只能自己来总结规律。

    0 + 0 = 0

    1 + 0 = 1

    0 + 1 = 1

    1 + 1 = 10

    可以看到本位的运算结果是 a ^ b,而进位的运算结果是 a & b << 1

    那么刚刚的算法就可以拆分为:

    bit[i] = a[i] ^ b[i]

    tempcarry[i+1] = a[i] & b[i] << 1

    bit[i] = carry[i] ^ bit[i]

    tempcarry[i+1] = tempcarry[i+1] | (carry[i] & bit[i] << 1) // 这一步必然不可能会发生进一步的进位,所以是取或

    ---

    carry = tempcarry

    但是这样很复杂,我们可以试着去分离一下:我们不需要逐位地去进行 a + b + carry 的操作,而是先计算 c = a ^ b,然后计算 carry = a & b << 1,最后计算 c + carry,以此类推,直到carry没有为止。

    这样就得到了:

    return b == 0 ? a : getSum(a ^ b, (a & b) << 1);

  • 相关阅读:
    配置JDK
    360首页(练习)
    表单练习——(简单的注册页面)
    主页
    证明某字母是否最后一个字母
    方法的重载与重写区别
    什么是设计模式
    java 静态方法和实例方法的区别
    什么是静态方法
    手机充电(练习)
  • 原文地址:https://www.cnblogs.com/KakagouLT/p/15336622.html
Copyright © 2020-2023  润新知