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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值