欢迎来真孝善网,为您提供真孝善正能量书籍故事!

LeetCode算法解析:371. 两整数之和解题方法及技巧

时间:11-24 神话故事 提交错误

大家好,今天来为大家解答LeetCode算法解析:371. 两整数之和解题方法及技巧这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

大意:

计算两个整数a和b的和,但不能使用+或-运算符。

例如:

给定a=1 且b=2,返回3。

思路:

这个问题乍一看似乎很简单。计算两个数字的总和。但问题是你不能直接使用加号和减号。这很尴尬。但如果不这样做,那就不能称为问题。其实对于运算来说,我们知道计算机本身并没有任何加减乘除运算。一切都是执行一些位运算的二进制,因此这里一个明显的想法是将其转换为位运算。当然,如果你已经知道加法的实现原理,也可以直接使用。

我们先来看看个位数的二进制运算:

1 + 1=10;

1 + 0=1;

0 + 1=1;

0 + 0=0。

如果我们使用^,也就是按位异或运算来做:

1^1=0;

1^0=1;

0^1=1;

0^0=0。

事实上,我们通过观察可以看出,异或和直接加法的唯一区别就是1+1。但换个思路,1+1需要进位。进位后,个位仍然变成0,所以是一样的,但是仍然需要进位运算,而对于二进制来说,只有当两个都是1时才会进位。这立刻让你想起了“AND”操作,对吧?

1 1=1;

1 0=0;

0 1=0;

0 0=0。

既然是进位,当然要把结果进一位。这里我们可以只使用左移运算符,因此对于1+1,方法是异或加进位与:

1+1=1^1 + (11)1

当然,我们仍然不能有加号,所以我们仍然必须使用相同的方法进行加法。这就是递归。什么时候结束?按理来说,直到没有carry为止就够了。

现在让我们看一下两位数加法:11+ 10=101

第一个11^10=01,

那么1110=10,左移一位得到100,

现在有进位,则继续01+100,

01^100=101,

01100=000,

此时与运算后的结果为0,可以停止运算。最终结果应该是101,答案是正确的。说明这个想法是正确的。

代码(Java)

公开课解决方案{

公共int getSum(int a, int b) {

如果(b==0)返回a;

int 总和,向上;

总和=a^b;

向上=(ab)1;

返回getSum(sum, up);

}

}代码非常简单。这是一个递归调用。每次调用时,首先检查进位计算是否为0,即是否没有进位。如果没有进位,则异或运算就是最终结果。如果还有进位,继续计算,计算完异或和左移后继续调用。

看来这些看似简单的运算符需要理解清楚。

收藏:https://github.com/Cloudox/LeetCode-Record

关于本次LeetCode算法解析:371. 两整数之和解题方法及技巧和的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

用户评论

逾期不候

真香!最近在刷题遇到这道题,感觉思路挺清晰的

    有12位网友表示赞同!

留我一人

这个算法真的太巧妙了,我一开始还以为要用循环加法,没想到可以用位运算

    有10位网友表示赞同!

陌上花

LeetCode笔记总结得不错,把重点都抓住了,方便新手理解

    有10位网友表示赞同!

初阳

终于解决这道题了,感觉自己的编程能力提高了不少

    有18位网友表示赞同!

爱到伤肺i

之前也做了一道类似的题目,思路有点相似,很适合 consolidation一下

    有6位网友表示赞同!

龙吟凤

学习位运算真是打开了新局面!

    有18位网友表示赞同!

念旧是个瘾。

这种解法的空间复杂度和时间复杂度都很低,完美!

    有5位网友表示赞同!

旧事酒浓

点赞作者能把知识点总结得这么简洁明了!

    有18位网友表示赞同!

太难

LeetCode刷题真的很锻炼人,但每次解决问题都很有成就感

    有16位网友表示赞同!

请在乎我1秒

分享你的经验真的很有帮助,我还在思考这道题的解法

    有10位网友表示赞同!

沐晴つ

看来还需要多练习位运算,它的应用场景很多

    有16位网友表示赞同!

安之若素

笔记总结很好,代码注释也写的非常清楚,方便跟进学习

    有6位网友表示赞同!

看我发功喷飞你

以后遇到类似的题目应该就能想到用位运算解决啦!

    有10位网友表示赞同!

伤离别

刷题越来越舒服了,能掌握更多的算法思维

    有5位网友表示赞同!

花容月貌

这种解法简直太优雅了!我之前一直以为只能使用循环加法

    有10位网友表示赞同!

孤自凉丶

LeetCode是一份很好的学习资源,要坚持下去!

    有13位网友表示赞同!

孤廖

分享你的笔记让我感觉自己也上了趟快车!

    有5位网友表示赞同!

ヅ她的身影若隐若现

刷题的好习惯培养出来就是好!效率更高了

    有8位网友表示赞同!

金橙橙。-

知识的传播真的很温暖,感谢作者的分享!

    有12位网友表示赞同!

【LeetCode算法解析:371. 两整数之和解题方法及技巧】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活