![34247186252c182d9b4edc901abb0128.png](https://i-blog.csdnimg.cn/blog_migrate/c0157e96bbea04988a8403f18cc34113.jpeg)
一直很纠结算法的文章应该怎么写。最后觉得还是从最简单的level开始写吧,一开始就弄些重量级的,什么人工智能,机器学习的算法,还要有大量的数学以及优化的知识,小白们估计会很郁闷,当然我也不一定能做出来对吧。
我计划每题给出两种语言的解决方案,一种静态语言,一种动态语言。
我选择C语言,Python和Java作为实现语言,由于篇幅有限,其他语言的实现有兴趣的朋友请自己尝试。
LeetCode 371. 两整数之和(Sum of Two Integers)
问题描述:
不使用运算符 + 和 - ,计算两整数 a 、b 之和。
示例:
![d3ab9359b15d43bc91db560853b0ea59.png](https://i-blog.csdnimg.cn/blog_migrate/b3f5db48514b3d0617707904e117c17a.jpeg)
C语言实现:
既然不让用+和-,那么只能用位运算或者乘除和余来实现。
如果我们将两个数转换成二进制,则有 0+0=0,0+1=1,1+1=10,我们忽略掉进位的话就变成了0+0=0, 0+1=1, 1+1=0,这个时候我们完全可以把+替换成^。但是如何处理进位呢?
我们会发现只有1+1时才发生进位,即1&1才进位,但是进位是进到前面一位的,所以我们要将进位的1再左移一位。这个时候我们将上述得到的两个新数再次执行异或,如果没有进位的话,这将是最后我们要的结果,但是有可能还有进位。若还有进位的话,我们就要重复上面的步骤,一直到处理完所有的进位。最后的结果将是异或不会再次遇到进位问题,得到最终结果。
我们如何判断异或不会遇到进位?根据两个数&的结果,如果有进位,&的结果一定不等于0,所以&的结果可以作为判断计算是否结束的条件。
下图演示了26+13=39的步骤:
![c89fd3ef15cc7ab767a8ee9009ddd70a.png](https://i-blog.csdnimg.cn/blog_migrate/49a42d4c8dc844c5aae5009b636f4710.jpeg)
具体代码如下:
![35d3746b80b1947eff01dfc22348643e.png](https://i-blog.csdnimg.cn/blog_migrate/99fbafbe867827daec850e54dbbf858f.jpeg)
![7765cea2514a0a43e9f3a95a8fbe1d51.png](https://i-blog.csdnimg.cn/blog_migrate/ae7e780aa25acd2efad4d0e064dfad18.jpeg)
python语言的实现:
python的实现和C语言的实现基本一致,但是注意python的整型长度是没有限制的。我们需要限制在32位长度范围内,所以我们要对位操作的结果再与0xffffffff来做限制。
此外最终的结果可能是大于32位最大正整数的(即0x7fffffff),而在python中大于这个数的值,仍然表示为正数,而我们期望它应该是一个负数,所以当最终的结果大于0x7fffffff的时候我们要对其取反,这样既可得到相应的负数。
代码如下:
![b9e85214603cafea857ade23a5332c6c.png](https://i-blog.csdnimg.cn/blog_migrate/52c933ad081048d0cda53694aa871333.jpeg)
![5261f05a959ebd6e0df0e426afd43d67.png](https://i-blog.csdnimg.cn/blog_migrate/c667c61047b0799ae1392682904946e5.jpeg)
Java语言的实现:
Java的实现和python语言的实现相同。
代码如下:
![463b8a2295ae084f9569bace14d166b6.png](https://i-blog.csdnimg.cn/blog_migrate/dde85bbbbd052fd0893452b1d297ab64.jpeg)
![91de4f7ba22069195f578561afaae536.png](https://i-blog.csdnimg.cn/blog_migrate/f63da61225e32c8ce86c3d387312ae8a.jpeg)