[LeetCode] 371. Sum of Two Integers
Posted aaronliu1991
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 371. Sum of Two Integers相关的知识,希望对你有一定的参考价值。
两整数之和。题意是不用加减法做到对两个整数求和。思路是位运算,但是非常难想,需要复习。我是参考了这个帖子才想通了的。
a | b | 低位 | 进位 |
---|---|---|---|
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)。那么做法就是设两个变量lower和carry来分别记录两者相加的低位和高位。lower = a ^ b, carry = a & b,一轮结束后,如果carry = 0说明没有进位,则可以直接退出while循环并且返回lower;如果carry = 1则说明有进位,此时需要把低位赋予a,把carry左移一位的结果赋予b再做运算。
时间O(1)
空间O(1)
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的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 第 371 题 (Sum of Two Integers)
Leetcode - 371. Sum of Two Integers
leetcode-371-Sum of Two Integers
LeetCode 371. Sum of Two Integers