• [LeetCode] 371. Sum of Two Integers


    Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

    Example 1:

    Input: a = 1, b = 2
    Output: 3
    

    Example 2:

    Input: a = -2, b = 3
    Output: 1

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

    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再做运算。例子,5 + 7的话,其实是101 + 111

    a ^ b如下 = 相加各个位置上的值但是不计算进位

    1 0 1

    1 1 1

    ----

    0 1 0

    a & b如下 = 计算各个位置上的进位值

    1 0 1

    1 1 1

    ----

    1 0 1,再向左移动一位,101 << 1 = 1010

    重复上述两步,

    a ^ b = 010 ^ 1010 = 0010 ^ 1010 = 1000

    a & b = 010 & 1010 = 0010 & 1010 = 0010,左移一位,0010 << 1 = 0100

    重复上述两步,

    a ^ b = 1000 ^ 0100 = 1100

    a & b = 1000 & 0100 = 0000,因为这里进位为0,可以跳出循环了,结果就是1100

    时间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 题目总结

  • 相关阅读:
    实习项目1.
    try catch finally的用法
    asp.net 验证控件
    数据库操作语言
    webform Response的一些成员
    jQuery
    C#@的用法
    SQL分页查询
    抽象类与接口的区别
    抽象类与接口
  • 原文地址:https://www.cnblogs.com/cnoodle/p/11695656.html
Copyright © 2020-2023  润新知