备战秋招60天算法挑战,Day24

题目链接: https://leetcode.cn/problems/sum-of-two-integers/

视频题解: https://www.bilibili.com/video/BV1RZ421K7YF/

LeetCode 371.两整数之和

题目描述

给你两个整数 ab ,不使用 运算符 +- ​​​​​​​,计算并返回两整数之和。

举个例子:

复制代码
输入:a = 1, b = 2
输出:3

视频题解

两整数之和

思路来源

思路来源

知识回顾

  1. &)运算的规则

    1 & 1 = 1
    1 & 0 = 0
    0 & 1 = 0
    0 & 0 = 0

两位同时为1,结果才为1

  1. |)运算的规则

    1 | 1 = 1
    1 | 0 = 1
    0 | 1 = 1
    0 | 0 = 0

有一位为1,结果就为1

  1. 异或^)运算的规则

    1 ^ 1 = 0
    1 ^ 0 = 1
    0 ^ 1 = 1
    0 ^ 0 = 0

两位不同,结果才为1

  1. 左移运算符 <<,可以将一个对象的二进制向左移n位,左边n位丢弃,右边n位补0。比如,a = 1101

    a << 2 = 0100

  2. 右移运算符 >>,可以将一个对象的二进制向右移n位,右边n位丢弃,左边n位补0。比如,a = 1101

    a >> 2 = 0011

思路解析

正常的十进制加法是加数和被加数每一位相加然后加上上一位的进位数,大于10就继续进位。 题目要求不使用加法运算符 ,所以我们只能通过异或^)、&)、左移<<)等位运算来实现。

加数和被加数对应的二进制按位相加,1 + 1对应位变成01 + 0对应位变成10 + 0对应位变成0,这个可以通过异或^)运算来实现。

那么还有进位怎么处理呢?

继续观察会发现加数和被加数对应的二进制按位相加,只有1 + 1会存在进位1,可以通过&)和左移<<)运算来实现。

根据上述规律,对于ab两个整数,我们可以得到算法如下:

  1. temp_add = a ^ b,获取到每一位的和(不包含进位),进入步骤2
  2. temp_carry = (a & b) << 1,获取到每一位的进位,进入步骤3
  3. 如果进位temp_carry0,最终结果就是temp_add。如果进位temp_carry不为0a = temp_addb = temp_carry,进入步骤1

C++代码

cpp 复制代码
class Solution {
public:
    int getSum(int a, int b) {

        while (b) {
            int temp_add = a ^ b; //不包含进位a、b每位的和
            //a、b每位和的进位,左移有符号值会溢出,赋给无符号的会自动取模
            unsigned int temp_carry = (unsigned int)(a & b) << 1; 
            a = temp_add; //a、b每位的和赋值给a
            b = temp_carry; //a、b每位的进位赋值给b
        }
        return a;
    }
};

java代码

java 复制代码
class Solution {
    public int getSum(int a, int b) {
        while (b != 0) {
            int temp_add = a ^ b; // 不包含进位a、b每位的和
            // a、b每位和的进位,左移有符号值会溢出,赋给无符号的会自动取模
            int temp_carry = (a & b) << 1;
            a = temp_add; // a、b每位的和赋值给a
            b = temp_carry; // a、b每位的进位赋值给b
        }
        return a;
    }
}

python代码

python 复制代码
class Solution:
    def getSum(self, a: int, b: int) -> int:
        while b:
            temp_add = a ^ b  # 不包含进位a、b每位的和
            # a、b每位和的进位,左移有符号值会溢出,赋给无符号的会自动取模
            temp_carry = (a & b) << 1
            a = temp_add  # a、b每位的和赋值给a
            b = temp_carry  # a、b每位的进位赋值给b
        return a

复杂度分析

时间复杂度: O(1) ,因为整数在32位操作系统上占32位,最多计算32temp_carry,故为常数的时间复杂度。

空间复杂度: 只使用了几个整型变量,故空间复杂度为O(1)

相关推荐
伊玛目的门徒11 分钟前
告别 OpenAI SDK:如何使用 Python requests 库调用大模型 API(例如百度的ernie-4.5-turbo)
python·openai·requests·大模型调用·ernie-4.5-turbo
Sam-August25 分钟前
【分布式架构实战】Spring Cloud 与 Dubbo 深度对比:从架构到实战,谁才是微服务的王者?
java·spring cloud·dubbo
塔中妖25 分钟前
【华为OD】查找接口成功率最优时间段
算法·链表·华为od
塔中妖28 分钟前
【华为OD】最大子矩阵和
算法·华为od·矩阵
麦兜*34 分钟前
MongoDB 常见错误解决方案:从连接失败到主从同步问题
java·数据库·spring boot·redis·mongodb·容器
努力学习的小廉1 小时前
深入了解linux系统—— 线程同步
linux·服务器·数据库·算法
数据爬坡ing1 小时前
从挑西瓜到树回归:用生活智慧理解机器学习算法
数据结构·深度学习·算法·决策树·机器学习
ytadpole1 小时前
揭秘设计模式:命令模式-告别混乱,打造优雅可扩展的代码
java·设计模式
luoganttcc1 小时前
小鹏汽车 vla 算法最新进展和模型结构细节
人工智能·算法·汽车
sinat_602035361 小时前
模块与包的导入
运维·服务器·开发语言·python