feat: 两整数之和(371)

This commit is contained in:
= 2024-05-19 02:43:26 +08:00
parent 0ffef851da
commit 12964047ab
2 changed files with 72 additions and 0 deletions

View File

@ -0,0 +1,70 @@
/* leetcode 371
给你两个整数 a b 不使用 运算符 + - 计算并返回两整数之和
示例 1
输入a = 1, b = 2
输出3
示例 2
输入a = 2, b = 3
输出5
提示
-1000 <= a, b <= 1000
*/
/*
在计算机中反码补码和原码是用来表示整数的不同编码方式
原码即数字的真实表现形式也就是它的符号位加上其二进制表示形式正数的原码与其二进制表示形式相同负数的原码最高位为1其余位为其绝对值的二进制表示形式
反码负数的反码是其原码除符号位外各位取反0变11变0得到的结果正数的反码与其原码相同
补码负数的补码是其反码加1得到的结果正数的补码与其原码相同
举个例子
原码+5 的原码是 00000101-5 的原码是 10000101
反码+5 的反码与其原码相同 00000101-5 的反码是 11111010
补码+5 的补码与其原码相同 00000101-5 的补码是其反码加1得到的结果 11111011
*/
var getSum = function(a, b) {
while (b != 0) {
const carry = (a & b) << 1;
a = a ^ b;
b = carry;
}
return a;
};
var getSum2 = (a, b)=>{
if(b===0) return a // 如果进位结果为0就结束递归
const carry = (a & b) << 1;
const c = a ^ b;
getSum2(c, carry)
}
/**
思考
为什么这样就能实现加法运算我们在小学的时候做加法运算的时候会列竖式如果是没有进位的加法我们可以
很快的做出来比如说123+123想都不要想就知道是246但是如果结果里面有进位那么就不能一眼看出来比如
456+645 这个结果一眼是看不出来的经过计算我们可以知道他的结果是1101首先我们从个位开始加6+5
等于1向前面进一位之后再5+4+1得到结果10向前进一位之后4+6+1得到结果11🔎进一位这里面我们总共进了
三次位所以只要把把没进位的数和进位的数相加得到的结果不就是结果吗
4 5 6 4 5 6
6 4 5 6 4 5
-------- ---------
0 9 1 1 1 1 1
*/
console.log(getSum(1,0));
console.log(getSum2(2,0));

View File

@ -2,3 +2,5 @@
这个目录存放的是列表相关的数据结构
# 对应题目
* 两整数之和 /leetcode/中等/两整数之和.js