算法 1.2.2 两整数之和(不使用“+”)【leetcode

2020-12-29  本文已影响0人  珺王不早朝

题目描述

两整数之和
不使用运算符 + 和 - ,计算两整数 a 、b 之和。

示例 1:
输入: a = 1, b = 2
输出: 3

示例 2:
输入: a = -2, b = 3
输出: 1

数据结构

算法思维

解题要点


解题思路

一. Comprehend 理解题意

需要使用其他方式实现 “+” 的功能
可以使用位操作实现:
两个二进制数在某位上的数字相加的结果,与该位上两数字的 异或运算 结果一致,因此可以使用异或运算得到某个 bit 上两数字的相加结果
而进位的值相当于本位两数字做 与运算 的结果向左做1次 移位运算

算法原理
流程示意

注意:进位结果需要与相加结果再次“相加”,直到没有任何一位出现进位为止 -- 递归调用

二. Choose 选择数据结构与算法

数据结构:bit
算法思维:位运算(先不使用递归)
时间复杂度:O(?)
空间复杂度:O(1) -- 只占用一个整数的内存空间

三. Code 编码实现基本解法
class Solution{
 public int getSum(int a, int b) {

        // 提示:视作二进制数,本位结果用异或求得,进位用与运算和移位运算求得

        int and = (a & b) << 1;
        int xor = a ^ b;
        int tmp = 0;

        while(and != 0){
            tmp = xor ^ and;
            and = (xor & and) << 1;
            xor = tmp;
        }

        return xor;
    }
}

执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:35 MB,击败了84.85% 的Java用户

四. Consider 思考更优解

改变算法思维:位运算 + 递归
时间复杂度:O(?)
空间复杂度:O(1)

五. Code 编码实现最优解
class Solution{
   public int getSum(int a, int b) {
        if (b != 0){
            int and = (a & b) << 1;
            int xor = a ^ b;
            return getSum(xor,and);
        }
        return a;
    }
}

执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:35 MB,击败了85.71% 的Java用户

六. Change 变形与延伸

=== 待续 ===

上一篇 下一篇

猜你喜欢

热点阅读