feat: 两整数之和(371)
This commit is contained in:
parent
0ffef851da
commit
12964047ab
70
leetcode/中等/两整数之和.js
Normal file
70
leetcode/中等/两整数之和.js
Normal 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变1,1变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));
|
@ -2,3 +2,5 @@
|
||||
这个目录存放的是列表相关的数据结构
|
||||
|
||||
# 对应题目
|
||||
|
||||
* 两整数之和 /leetcode/中等/两整数之和.js
|
Loading…
x
Reference in New Issue
Block a user