leetcode每日一题系列-两整数之和-「位运算」-「位运算+递归」

338 阅读1分钟

leetcode-371-两整数之和

[博客链接]

菜🐔的学习之路

掘金首页

[题目链接]

题目链接

[github地址]

github地址

[题目描述]

给你两个整数 a 和 b ,不使用 运算符 + 和 - ​​​​​​​,计算并返回两整数之和。

 

示例 1:

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

输入:a = 2, b = 3 输出:5

思路一:位运算

  • 普通进位需要统计每一位的运算结果
  • 记录之前的进位情况
    • 第一种情况:两个当前位均为1,计算后结果位为前一位进位,同时进位变为1
    • 第二种情况:两个当前位只有一个为1,计算结果后根据进位判断是否进位:
      • 如果进位为1,则进位不变还是1,当前位为0
      • 如果进位为0,则进位不变还是0,当前位为1
    • 第三种情况:两个当前位都是0,根据进位判断,进位变为0

int res = 0;
            for (int i = 0, t = 0; i < 32; i++) {
                int num1 = (a >> i) & 1, num2 = (b >> i) & 1;
                if (num1 == 1 && num2 == 1) {
                    res |= (t << i);
                    t = 1;
                } else if (num1 == 1 || num2 == 1) {
                    res |= ((1 ^ t) << i);
                }else{
                    res |= (t << i);
                    t = 0;
                }
            }
            return res;

  • 时间复杂度O(lgn)最多为32
  • 空间复杂度O(1)

思路二:递归解决

  • 其实这种非加减法运算符计算很容易想到异或运算
  • 异或就是无进位加法运算
  • 进位可以用(a&b)>>i
  • 递归运算即可
 public int getSum(int a, int b) {
            return b == 0 ? a : getSum(a ^ b, (a & b) << 1);
        }
  • 时间复杂度O(lgn)最多为32
  • 空间复杂度O(1)