LeetCode官方题解:https://leetcode-cn.com/problems/qiu-12n-lcof/solution/qiu-12n-by-leetcode-solution/
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/qiu-12n-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
看到这道题的第一反应:嗯?这算什么面试题嘛,这不是入门算法?一个高斯公式不就搞定了,或者一个循环、递归就完事了。
然后就写出了以下代码:
class Solution {
public int sumNums(int n) {
return (n+1)*n/2;
}
}
后面仔细一看,emmm,我是个什么东西,要求不能用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
我擦?刚刚列举的都要用到上面的啊,原来搞半天我就是个弟弟,就是限制了这个题才会成为面试题,而且还是中等难度的。
嘶,那既然限制了这么多条件,那怎么去实现呢,我们先看一下,排除限制使用的乘除法、for循环……我们还剩下加减法、位运算、逻辑运算可用
我们先来看一下正常方式的递归:
class Solution{
public int sumNums(int n) {
if(n == 1) return 1;
n += sumNums(n - 1);
return n;
}
}
上面递归用了if语句来终止递归,显然是不符合题目要求的,那么有没有其它方式可以替代这个if语句呢,这时候我们可以利用逻辑符的短路特性,比如 && 前面的语句如果是 false,那么就不会执行后面的语句,**||**前面的语句如果是 true 那么就不会执行看后面的语句了
利用这个性质,我们可以更改一下递归的代码:
class Solution{
public int sumNums(int n) {
//逻辑符短路--一旦 & 前面的条件不满足了就不会执行后面的语句
boolean flag = n > 0 && (n += sumNums(n - 1)) > 0;
return n;
}
}
如此便能完美完成题目要求