求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
限制:1 <= n <= 10000
解题思路:
- 1.递归
- 2.移位运算符
1.递归
/**
* @param {number} n
* @return {number}
*/
var sumNums = function(n) {
let sum = n;
return n > 0 && (sum += sumNums(n - 1))
};
2.移位运算符
解题代码:
/**
* @param {number} n
* @return {number}
*/
var sumNums = function(n) {
return (Math.pow(n, 2) + n) >> 1
};
JS移位运算符补充:
1.“<<”运算符
“<<”运算符执行左移位运算。在移位运算过程中,符号位始终保持不变。如果右侧空出位置,则自动填充为 0;超出 32 位的值,则自动丢弃。
把数字 5 向左移动 2 位,则返回值为 20。
2.“>>”运算符
“>>”运算符执行有符号右移位运算。与左移运算操作相反,它把 32 位数字中的所有有效位整体右移,再使用符号位的值填充空位。移动过程中超出的值将被丢弃。
把数值 1000 向右移 8 位,则返回值为 3。
3.“>>>”运算符
“>>>”运算符执行五符号右移位运算。它把无符号的 32 位整数所有数位整体右移。对于无符号数或正数右移运算,无符号右移与有符号右移运算的结果是相同的。
下面两行表达式的返回值是相同的。
console.log(1000 >>> 8); //返回值3
console.log(1000 >> 8); //返回值3