79 不用加減乘除做加法

hellosc01發表於2020-11-30

1 題目描述

寫一個函式,求兩個整數之和,要求在函式體內不得使用 “+”、“-”、“*”、“/” 四則運算子號。

示例:

輸入: a = 1, b = 1
輸出: 2

提示:

a, b 均可能是負數或 0
結果不會溢位 32 位整數

2 解題(Java)

  1. 位運算;
  2. 無進位和 與 異或運算 相同,進位 和 與運算 相同(並需左移一位);
  3. 迴圈求無進位和a與進位和b ,直至進位 b = 0;此時 a = n ,返回 nn 即可。
class Solution {
    public int add(int a, int b) {
        while(b != 0) { // 當進位為 0 時跳出
            int c = (a & b) << 1;  // c = 進位
            a ^= b; // a = 非進位和
            b = c;
        }
        return a;
    }
}

3 複雜性分析

  • 時間複雜度 O(1): 最差情況下(例如 a= 0x7fffffff , b=1 時),需迴圈 32 次,使用 O(1) 時間;每輪中的常數次位操作使用 O(1) 時間;
  • 空間複雜度 O(1) : 使用常數大小的額外空間;

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof

相關文章