Skip to content

Files

Latest commit

c29b144 · May 17, 2024

History

History
This branch is 2 commits ahead of, 1194 commits behind doocs/leetcode:main.

2235.Add Two Integers

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
May 17, 2024
May 17, 2024
Jan 13, 2024
Jan 13, 2024
Jun 15, 2023
Jan 13, 2024
Jan 13, 2024
Dec 1, 2022
Apr 30, 2022
Jan 13, 2024
Jan 13, 2024
Jan 13, 2024
Jan 13, 2024
Jan 13, 2024
Jan 13, 2024
comments difficulty edit_url tags
true
简单
数学

English Version

题目描述

给你两个整数 num1num2,返回这两个整数的和。

 

示例 1:

输入:num1 = 12, num2 = 5
输出:17
解释:num1 是 12,num2 是 5 ,它们的和是 12 + 5 = 17 ,因此返回 17 。

示例 2:

输入:num1 = -10, num2 = 4
输出:-6
解释:num1 + num2 = -6 ,因此返回 -6 。

 

提示:

  • -100 <= num1, num2 <= 100

解法

方法一:使用加法运算符

我们可以直接使用加法运算符 + 来计算两个整数的和。

时间复杂度 O ( 1 ) ,空间复杂度 O ( 1 )

Python3

class Solution:
    def sum(self, num1: int, num2: int) -> int:
        return num1 + num2

Java

class Solution {
    public int sum(int num1, int num2) {
        return num1 + num2;
    }
}

C++

class Solution {
public:
    int sum(int num1, int num2) {
        return num1 + num2;
    }
};

Go

func sum(num1 int, num2 int) int {
	return num1 + num2
}

TypeScript

function sum(num1: number, num2: number): number {
    return num1 + num2;
}

Rust

impl Solution {
    pub fn sum(num1: i32, num2: i32) -> i32 {
        num1 + num2
    }
}

C

int sum(int num1, int num2) {
    return num1 + num2;
}

方法二:位运算(不使用加法运算符)

我们也可以在不使用加法运算符的前提下,使用位运算来计算两个整数的和。

假设 n u m 1 i n u m 2 i 分别表示 n u m 1 n u m 2 的第 i 个二进制位。一共有 4 种情况:

n u m 1 i n u m 2 i 不进位的和 进位
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1

观察可以发现,“不进位的和”与“异或运算”有相同规律,而进位则与“与”运算规律相同,并且需要左移一位。

因此:

  • 对两数进行按位 & 与运算,然后左移一位,得到进位,记为 c a r r y
  • 对两数进行按位 ^ 异或运算,得到不进位的和;
  • 问题转换为求:“不进位的数 + 进位” 之和;
  • 循环,直至第二个数为 0 ,返回第一个数即可(也可以用递归实现)。

时间复杂度 O ( log M ) ,其中 M 为题目中数字的最大值。空间复杂度 O ( 1 )

Python3

class Solution:
    def sum(self, num1: int, num2: int) -> int:
        num1, num2 = num1 & 0xFFFFFFFF, num2 & 0xFFFFFFFF
        while num2:
            carry = ((num1 & num2) << 1) & 0xFFFFFFFF
            num1, num2 = num1 ^ num2, carry
        return num1 if num1 < 0x80000000 else ~(num1 ^ 0xFFFFFFFF)

Java

class Solution {
    public int sum(int num1, int num2) {
        while (num2 != 0) {
            int carry = (num1 & num2) << 1;
            num1 ^= num2;
            num2 = carry;
        }
        return num1;
    }
}

C++

class Solution {
public:
    int sum(int num1, int num2) {
        while (num2) {
            unsigned int carry = (unsigned int) (num1 & num2) << 1;
            num1 ^= num2;
            num2 = carry;
        }
        return num1;
    }
};

Go

func sum(num1 int, num2 int) int {
	for num2 != 0 {
		carry := (num1 & num2) << 1
		num1 ^= num2
		num2 = carry
	}
	return num1
}

TypeScript

function sum(num1: number, num2: number): number {
    while (num2) {
        const carry = (num1 & num2) << 1;
        num1 ^= num2;
        num2 = carry;
    }
    return num1;
}

Rust

impl Solution {
    pub fn sum(num1: i32, num2: i32) -> i32 {
        let mut num1 = num1;
        let mut num2 = num2;
        while num2 != 0 {
            let carry = (num1 & num2) << 1;
            num1 ^= num2;
            num2 = carry;
        }
        num1
    }
}