LeetCode 面试题64--求1+2+...+n 两行代码就够了?

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;
	}
}

如此便能完美完成题目要求
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44215175/article/details/106488330