zoukankan      html  css  js  c++  java
  • Leetcode 371.两整数之和 By Python

    不使用运算符 +- ,计算两整数 ab 之和。

    示例 1:

    输入: a = 1, b = 2
    输出: 3
    

    示例 2:

    输入: a = -2, b = 3
    输出: 1
    

    思路

    比如(5+6=11)

    我们可以按照如下步骤:

    • 先不考虑进位为1
    • 考虑进位之后(10+1=11)
    • 直到没有进位的情况出现才结束

    二进制也是类似处理:

    • 先“按位加”,也就是异或,在python中为^
    • 处理进位,进位就是和,在python中为&,还要左移<<1位
    • 循环上述步骤就好了

    要特别注意的是:

    python中一直左移是不会溢出的,所以要手动模拟32位int型

    代码

    class Solution(object):
        def getSum(self, a, b):
            """
            :type a: int
            :type b: int
            :rtype: int
            """
            MAX_INT = 0x7FFFFFFF    #int类型最大的值
            MIN_INT = MAX_INT + 1
            MASK = 0x100000000		#等于2^32,1-32位上都是1
            while b != 0:
                carry = (a & b) << 1	#表示进位
                a = (a ^ b) % MASK	#对其取余则将范围限制在[0,2^32-1]内,也就是int的范围
                b = carry % MASK	#同理
            return a if a <= MAX_INT else ~((a % MIN_INT) ^ MAX_INT)	
    
    #如果小于MAX_INT就不用处理了,如果溢出就要:
    #以4位bit为例,从0000-1111,可以表示的范围为[0,15],如果计算出16那就是溢出了,16是10000,此时的MIN_4BIT为16,取余为0,0000异或1111为1111再取反就是0了,将范围限制在了4位bit的范围内
    

    当然你也可以这么偷懒哈哈哈哈哈哈哈

    class Solution(object):
        def getSum(self, a, b):
            """
            :type a: int
            :type b: int
            :rtype: int
            """
            return sum([a,b])
    
  • 相关阅读:
    级联操作
    深入解析http协议
    http状态码
    数据库在一对一、一对多、多对多怎么设计表关系
    [转载]C#深拷贝的方法
    TraceSource记录程序日志
    .NET 垃圾回收与内存泄漏
    DevExpress GridControl使用方法总结
    DevExpress使用技巧总结
    Oracle 错误代码小结
  • 原文地址:https://www.cnblogs.com/MartinLwx/p/9719576.html
Copyright © 2011-2022 走看看