LeetCode 371.Sum of Two Integers 解题报告

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 -.


示例

Given a = 1 and b = 2, return 3.


限制条件

不能使用+和-两个运算符。


解题思路

题目看起来很简单,但是要是没有找对方向,怕是怎么也做不出吧。
我一开始就是在错误的方向里钻了牛角尖,最初的想法是通过其他的数学运算来完成加法的功能:
a+b=log10(10a×10b)
但是当 a b为大数时,会产生数据溢出,所以这种方式不可行。
后来也有想着用字符串表示数字之类的奇怪的方法但都不行,终于还是查看了一下LeetCode里这道题的标签,是bit manipulation,于是茅塞顿开。

这道题正确的思路应该是使用位操作来完成加法的效果。二进制的加法经过两个步骤:
1.两个二进制数相加,得到临时结果。
2.将临时结果与进位相加,得到最终的结果。

注意执行二进制加法时是对所有的位同时操作。步骤中有两个重要的概念,一个是加法操作,其实是通过位的异或运算^完成;另一个是进位,通过位的相与运算&能够找到进位的位置,再通过左移1位就能得到进位(不信可以自己演算一下)。循环进行以上两个步骤,上一次循环产生的进位及加法结果会成为下一次的两个加法操作数。当没有下一次进位时,临时结果就是最终结果,计算就结束了。
二进制加法过程

把第一次运算中的第一个运算数看做是一个临时结果,第二个运算数看做是一个进位的话,那么总结起来就是:计算好下一次进位,临时结果与当前进位异或,检查下一次进位是否为0,否就进入下一次循环,代码直观地反映了这一点。


代码

class Solution {
public:
    int getSum(int a, int b) {
        int c = 0;
        do {
            // next carry bit's position
            c = a & b;
            // a is current result and b is current carry bit
            a = a ^ b;
            // next carry bit    
            b = (c << 1); 
        } while(c);
        return a;
    }
};

总结

像这些特殊的题目还是要多做多积累经验,不然连方向都找不准。
今天又长了新知识,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值