leetcode371题解

本文介绍了一种利用位操作解决LeetCode第371题“两个整数之和”的方法,避免使用传统的加减运算符。通过异或进行无进位加法,并通过与运算判断进位,最后通过递归实现完整的加法运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

leetcode 371.Sum of Two Integers

题目

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

Example:
Given a = 1 and b = 2, return 3.
题目意思是:在不使用+和-运算的情况下,求两个整数的和。

解题思路

看到不能使用+和-,首先想到的应该就是位操作了。对于位操作来说,^和&是最常见的。我们先考虑一下这两个操作:
0^0=0,0^1=1,1^1=0(有进位) 可以看出异或做的是无进位的加法。
那怎么知道有没有进位呢?可以看到只有在两个bit都是1时,才有进位,而1&1=1(1&0=0)。
所以本题的思路如下:
1.按位做异或 a^b
2.计算是否有进位 (a&b)<<1 注意这里把结果左移一位,因为进位是加在高一位上的。
3.调用getSum再计算进位和无进位加法结果,即递归

AC代码如下

class Solution {
public:
int getSum(int a, int b) {
 if(b==0) return a;
 int sum=a^b;
 int carry=(a & b)<<1;
 return getSum(sum,carry);  
}
};

总结

leetcode上easy难度,主要是熟悉位操作,算作积累吧。
在leetcode这道题的讨论区里面看到一篇特别好的位操作总结,分享一下。

https://discuss.leetcode.com/topic/50315/a-summary-how-to-use-bit-manipulation-to-solve-problems-easily-and-efficiently

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值