码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] 371. Sum of Two Integers

时间:2020-04-30 13:14:31      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:target   col   注意   退出   循环   位运算   直接   javascrip   get   

两整数之和。题意是不用加减法做到对两个整数求和。思路是位运算,但是非常难想,需要复习。我是参考了这个帖子才想通了的。

ab低位进位
0 0 0 0
1 0 1 0
0 1 1 0
1 1 0 1

首先注意到,任意两个数字a和b相加的时候,他们的低位和高位的结果是什么?如上图所示,你会发现一个规律,低位的结果是a ^ b(两数相同为0,两数不同为1),而进位的结果是a & b(两数相同为0,两数不同为1)。那么做法就是设两个变量lowercarry来分别记录两者相加的低位高位。lower = a ^ b, carry = a & b,一轮结束后,如果carry = 0说明没有进位,则可以直接退出while循环并且返回lower;如果carry = 1则说明有进位,此时需要把低位赋予a,把carry左移一位的结果赋予b再做运算。

时间O(1)

空间O(1)

JavaScript实现

 1 /**
 2  * @param {number} a
 3  * @param {number} b
 4  * @return {number}
 5  */
 6 var getSum = function(a, b) {
 7     if (a === 0) {
 8         return b;
 9     }
10     if (b === 0) {
11         return a;
12     }
13     while (b !== 0) {
14         let carry = a & b;
15         a = a ^ b;
16         b = carry << 1;
17     }
18     return a;
19 };

 

Java实现

 1 class Solution {
 2     public int getSum(int a, int b) {
 3         if (a == 0) {
 4             return b;
 5         }
 6         if (b == 0) {
 7             return a;
 8         }
 9         int lower;
10         int carrier;
11         while (true) {
12             lower = a ^ b; // 计算低位
13             carrier = a & b; // 计算进位
14             if (carrier == 0) {
15                 break;
16             }
17             a = lower;
18             b = carrier << 1;
19         }
20         return lower;
21     }
22 }

 

[LeetCode] 371. Sum of Two Integers

标签:target   col   注意   退出   循环   位运算   直接   javascrip   get   

原文地址:https://www.cnblogs.com/aaronliu1991/p/11695656.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!