剑指Offer_#64_求1+2+…+n

剑指Offer_#64_求1+2+…+n

Contents

题目

求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:

输入: n = 3
输出: 6

示例 2:

输入: n = 9
输出: 45

限制:
1 <= n <= 10000

思路分析

这题有点脑筋急转弯的感觉,如果没有那些限制,有很多方法,且都很简单。

方法1:等差数列求和公式

public int sumNums(int n) {
    return (1 + n) * n / 2;
}

不能用乘除法,排除。

方法2:迭代累加

public int sumNums(int n) {
    int res = 0;
    for(int i = 1; i <= n; i++)
        res += i;
    return res;
}

需要用到循环语句,排除。

方法3:递归

public int sumNums(int n) {
    if(n == 1) return 1;
    n += sumNums(n - 1);
    return n;
}

要用到if语句判断递归是否终止,排除。

方法4:利用&&运算符的短路效应终止递归

可以利用java当中&&运算符的短路效应。也就是说,如果A&&B的第一个表达式A判断为false,那么不会再继续判断B的真假。
如果我们把B写成一个递归函数调用,当A的值为false,递归调用就会终止。
按照这种思路,修改方法3的代码,可以实现题目要求。

解答

class Solution {
    int res = 0;
    public int sumNums(int n) {
        //这个x的作用仅仅是接收表达式的值,但是并没有用到
        boolean x = n>=2 && sumNums(n - 1) > 0;
        res += n;
        return res;
    }
}

复杂度分析

时间复杂度:O(n),开启n个递归函数
空间复杂度:O(n),n层递归调用会占用O(n)的栈空间

猜你喜欢

转载自www.cnblogs.com/Howfars/p/13398659.html