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.跨越两岸:探索彼此的独特世界

上一篇:Load Impact免费网站压力测试与性能测试教程:零基础入门 下一篇:亲子成长日记篇十一:温馨回顾与美好期待