题目链接:
题目描述:
#面试题64. 求1+2+…+n
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
限制:
1 <= n <= 10000
通过次数44,332 | 提交次数51,623
分析:
这个题是把简单题加了诸多限制,变成了一道中等难度的题目。
因为不能用循环,动态规划的法子就不能用了;
不能使用乘除法,所以也不能用等差数列公式;
剩下的能用的只有加减法、位运算、逻辑运算符、赋值。
先来考虑能用 if 的话,递归要怎么写:
class Solution {
public int sumNums(int n) {
if(n == 0) return 0;
return n + sumNums(n- 1);
}
}
本题的难点在于,不能用 if 的情况下,如何设置递归的出口?
这种题目实在没遇到过,想了很久没有好的思路,看了官方题解。
“答案就是逻辑运算符的短路性质。”
对于 A && B,如果 A 为 false,则表达式为 false,不会再执行 B 语句。我们所要利用的正是这个短路性质,当 n = 0 时,应该是递归的出口,不执行n += sumNums(n- 1)
语句,其他非出口均执行。
需要注意的是,在 C++ 里可以这样写:n && (n += sumNums(n-1));
但是在 Java 中不可,Java 不认为这是一个语句,正确写法如下:boolean bl = n > 0 && (n += sumNums(n-1)) > 0;
代码:
/*
*不能用 if 的情况下,如何设置递归的出口
*看官方题解,善用逻辑运算符
*/
class Solution {
public int sumNums(int n) {
boolean bl = n > 0 && (n += sumNums(n-1)) > 0;
return n;
}
}
可以看看是如何利用逻辑运算符的短路性质:
用逻辑运算符的短路性质来巧妙地设置递归的出口是第一次遇到,是个很有创新的思路,需要理解记住,为以后做题提供一个思路。完全没接触过这个方法,想全凭自己想出来还是有点儿困难的。
5月26号开始断更了10天,忙着做核酸检测收拾行李返校了,接下来的6月会迎来一大批期末考试,疫情回来直接地狱模式…最晚到考试结束会恢复正常更新,到时候论文、算法、计算机基础三管齐下。