LeetCode刷题复盘笔记—371. 两整数之和

题目:371. 两整数之和

题目描述:
不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a 、b ​​​​​​​之和。

示例 1:

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

示例 2:

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

一、核心解题思路

a ^ b可以得到两数相加不进位的加法结果

(a & b) << 1可以得到两数相加产生的进位

二、正确解法

方法一:递归

C++版本:

class Solution {
public:
    int getSum(int a, int b) {
        if(!(a & b)) return a ^ b;
        return getSum(a ^ b,((unsigned int)(a & b)) << 1);
    }
};

方法二:迭代

C++版本:

class Solution {
public:
    int getSum(int a, int b) {
        while(b){
            int carry=((unsigned int)(a & b)) << 1; //进位
            a^=b;               //a作为低位
            b=carry;            //b作为进位
        }
        return a;
    }
};

Python版本:

class Solution(object):
    def getSum(self, a, b):
        mask=0x100000000       # 2^32
        MAX=0x7FFFFFFF         # 整型最大值
        MIN=MAX+1
        while b !=0:
            carry=(a & b)<<1
            a=(a ^ b)%mask    # 取余范围限制在[0, 2^32-1]内
            b=carry%mask
        if a<MAX:    
            return a
        else:
            return ~((a % MIN)^ MAX)    

总结

Notes:

C++
当a & b的结果是负数时,左移就会造成符号位的溢出,所以此处需要转换为unsigned int来避免可能出现的左移越界行为。

Python
主要的难点在于, python整数类型为Unifying Long Integers, 即无限长整数类型。在 Python 中,整数不是 32 位的,也就是说你一直循环左移并不会存在溢出的现象,这就需要我们手动对 Python 中的整数进行处理,手动模拟 32 位 INT 整型。
具体做法是将整数对 0x100000000 取模,保证该数从 32 位开始到最高位都是 0。

python 由于不知道符号位具体是第几位,因此需要进行的操作是:
1.将输入数字转化成无符号整数
2.计算无符号整数相加并的到结果
3.将结果根据范围判定是正数还是负数,映射为有符号整型


欢迎大家扫码关注本人公众号:编程复盘与思考随笔

(关注后可以免费获得本人在csdn发布的资源源码)

公众号主要记录编程和刷题时的总结复盘笔记和心得!并且分享读书、工作、生活中的一些思考感悟!在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Al资料站与复盘笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值