题目:
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
限制:
1 <= n <= 10000
第一眼看过去:我不敢相信这居然被划分到中等难度的题……这是低估我们的背公式能力吗。return n*(n+1)/2 不就行了吗
然后我仔细看了一下题目要求,发现我题目都没看清楚。
要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
本来如果没有要求,我们能想到的方法大概有这几种:
- 1.公式,有乘除法;
- 2.从1开始正向暴力加法,界定范围最大是n,到n+1需要结束,会用到判断语句;
- 3.递归计算 n + func ( n-1 ),界定范围最小是1,到0需要结束,会用到判断语句。
感觉到了死路一条?乘除法是不能用的,那么只能用加减法;正向暴力的加减法,最终的判断条件是 是否到达n,这判断语句无法避免;递归计算,判断条件是 是否到达 1 。
看看第三种方法的特殊性,结束条件0,也可以替换为,0和非0 的区别,那么 boolean 类型的 and 操作是可以使用的,得到和 if 一样的效果。
我们回忆一下 && 操作 的特性: A && B,如果A为true ,就会去执行B ,如果A 为false ,那么就直接跳过了,整个语句是false。
那么,A && B 式子中的 A 就适合填入 边界条件的判断,也就是 n (n减到0的那一刻,就为false了);B 则可以填入 累加的运算,保证在n还不是0的时候,对结果的更新。
class Solution {
public int sumNums(int n) {
int ans=n;
boolean flag = n>0 && ( ans += sumNums(n-1))>0;
return ans;
}
}
注意这里面对于n>0的判断:
flag = n>0
和后面递归的判断:
( ans += sumNums(n-1))>0
都不属于判断语句,而是简单的逻辑操作,所以没有违规。
- Java 中,为构成语句,需加一个辅助布尔量 xx ,否则会报错;
- Java 中,开启递归函数需改写为 sumNums(n - 1) >0 ,此整体作为一个布尔量输出,否则会报错.
不能轻敌啊。。。这个题如果是面试的时候直接拿出来,还真不一定做的出来