博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 371 Sum of Two Integers
阅读量:6036 次
发布时间:2019-06-20

本文共 819 字,大约阅读时间需要 2 分钟。

突然出现的一道easy标签的题目,题意很简单,两个数相加,但不能使用“+”,"-" 操作符。

首先想到不能使用加减操作符,能否使用乘除和多项式的转化表达出a+b,结果发现好像不能,无论如何都会出现需要+的项。

然后想到按位模拟运算,但是太麻烦了,感觉不是正解。

看了讨论区以后看到大神很神奇的一行代码搞定:

int getSum(int a, int b) {

return a & b ? getSum((a & b) << 1, a ^ b) : a | b;
}

试了一下,嗯,不是骗子,可以AC ,然后开始尝试理解:

首先当a&b = 0 时 return a| b , a&b = 1 时 return 一个递归式;

a&b = 0 的情况很好理解:当任何一个加数等于0时,返回另外一个加数即可

递归式比较复杂:

先看异或(^,开始当成了乘方,纠结了好久)运算:  0 ^ 0 = 0    0 ^ 1 = 1   1 ^ 0 = 1   1 ^ 1 = 0

               再看加法的进位运算:  0 + 0 = 1    0 + 1 = 1   1 + 0 = 1    1 + 1 = 0(进位)

除了进位的话结果完全一样,所以如果没有进位的话,我们可以直接用异或替代加法。

再考虑进位运算, 只有当 两位都是1 时才会进位, 那么通过与运算& 我们就可以得到所有两个数都为1 的位,由于进位是要加到高位上的,

所以我们再把与之后的结果左移一位,与异或后的结果相加,就可以得到完整的加法结果,

在递归过程中,一个参数表示异或的结果,另一个表示进位的结果,那么递归的终点呢?

就是不再进位,由于两个数是有限长度的,在经过最多32次循环后肯定不再需要进位,那么其中一个参数就会为0,我们就得到了最终的结果了。

膜拜大神们的思路,默默滚去刷题了~

转载于:https://www.cnblogs.com/nevgivin/p/5676592.html

你可能感兴趣的文章
Unity 框架篇
查看>>
Mysql常用DDL命令
查看>>
推荐几款专门为Github党量身定做的Chrome插件
查看>>
黑盒测试和白盒测试
查看>>
粘包、丢包及TCP信息收发
查看>>
Unity之使用技巧记录
查看>>
[四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式...
查看>>
.NET连接数据库方式
查看>>
JavaScript对象系统的使用
查看>>
HyperSnap 6捕获的视频图片都是一片漆黑
查看>>
时间选择控件YearPicker(基于React,antd)
查看>>
病毒文件
查看>>
1. lvs+keepalived 高可用群集
查看>>
学习新语言的练手项目
查看>>
React中路由传参及接收参数的方式
查看>>
Android调用系统相机拍照保存照片很小解决方案
查看>>
redis
查看>>
从零开始学习PYTHON3讲义(八)列表类型跟冒泡排序
查看>>
Excel应该这么玩——0、初衷:用IT方法玩Excel
查看>>
python小白项目推荐
查看>>