剑指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)的栈空间