371. Sum of Two Integers

LeetCode medium оригинал: C# #bit-manipulation #csharp #leetcode #math #medium

Даны два целых числа a и b. Вернуть сумму этих двух чисел, не используя операторы + и -.

Пример:

Input: a = 1, b = 2

Output: 3

C# решение

сопоставлено/оригинал
public class Solution {
    public int GetSum(int a, int b) {
        int x = System.Math.Abs(a), y = System.Math.Abs(b);
        if (x < y) return GetSum(b, a);
        int sign = a > 0 ? 1 : -1;
        if (a * b >= 0) {
            while (y != 0) {
                int carry = (x & y) << 1;
                x ^= y;
                y = carry;
            }
        } else {
            while (y != 0) {
                int borrow = ((~x) & y) << 1;
                x ^= y;
                y = borrow;
            }
        }
        return x * sign;
    }
}

C++ решение

auto-draft, проверить перед отправкой
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public int GetSum(int a, int b) {
        int x = System.abs(a), y = System.abs(b);
        if (x < y) return GetSum(b, a);
        int sign = a > 0 ? 1 : -1;
        if (a * b >= 0) {
            while (y != 0) {
                int carry = (x & y) << 1;
                x ^= y;
                y = carry;
            }
        } else {
            while (y != 0) {
                int borrow = ((~x) & y) << 1;
                x ^= y;
                y = borrow;
            }
        }
        return x * sign;
    }
}

Java решение

сопоставлено/оригинал
public class Solution {
    public int getSum(int a, int b) {
        int x = Math.abs(a), y = Math.abs(b);
        if (x < y) return getSum(b, a);
        int sign = a > 0 ? 1 : -1;

        if (a * b >= 0) {
            while (y != 0) {
                int carry = (x & y) << 1;
                x ^= y;
                y = carry;
            }
        } else {
            while (y != 0) {
                int borrow = ((~x) & y) << 1;
                x ^= y;
                y = borrow;
            }
        }
        return x * sign;
    }
}

JavaScript решение

сопоставлено/оригинал
class Solution {
    getSum(a, b) {
        let x = Math.abs(a), y = Math.abs(b);
        if (x < y) return this.getSum(b, a);
        const sign = a > 0 ? 1 : -1;

        if (a * b >= 0) {
            while (y !== 0) {
                const carry = (x & y) << 1;
                x ^= y;
                y = carry;
            }
        } else {
            while (y !== 0) {
                const borrow = ((~x) & y) << 1;
                x ^= y;
                y = borrow;
            }
        }
        return x * sign;
    }
}

Python решение

сопоставлено/оригинал
class Solution:
    def getSum(self, a: int, b: int) -> int:
        x, y = abs(a), abs(b)
        if x < y:
            return self.getSum(b, a)  
        sign = 1 if a > 0 else -1
        
        if a * b >= 0:
            while y:
                x, y = x ^ y, (x & y) << 1
        else:
            while y:
                x, y = x ^ y, ((~x) & y) << 1
        
        return x * sign

Go решение

сопоставлено/оригинал
package main

import "math"

func getSum(a int, b int) int {
    x, y := int(math.Abs(float64(a))), int(math.Abs(float64(b)))
    if x < y {
        return getSum(b, a)
    }
    sign := 1
    if a < 0 {
        sign = -1
    }

    if a * b >= 0 {
        for y != 0 {
            carry := (x & y) << 1
            x ^= y
            y = carry
        }
    } else {
        for y != 0 {
            borrow := ((^x) & y) << 1
            x ^= y
            y = borrow
        }
    }
    return x * sign
}

Algorithm

Упростите задачу до двух случаев: сумма или вычитание двух положительных целых чисел: x ± y, где x > y. Запомните знак результата.

Если нужно вычислить сумму:

Пока перенос не равен нулю (y != 0):

Текущий ответ без переноса равен XOR x и y: answer = x ^ y.

Текущий перенос равен сдвинутому влево AND x и y: carry = (x & y) << 1.

Подготовьтесь к следующему циклу: x = answer, y = carry.

Верните x * sign.

Если нужно вычислить разность:

Пока заимствование не равно нулю (y != 0):

Текущий ответ без заимствования равен XOR x и y: answer = x ^ y.

Текущее заимствование равно сдвинутому влево AND НЕ x и y: borrow = ((~x) & y) << 1.

Подготовьтесь к следующему циклу: x = answer, y = borrow.

Верните x * sign.

😎

Вакансии для этой задачи

Показаны активные вакансии с пересечением по тегам задачи.

Все вакансии
Активных вакансий пока нет.