剑指Offer面试题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

第一眼看过去:我不敢相信这居然被划分到中等难度的题……这是低估我们的背公式能力吗。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 ,此整体作为一个布尔量输出,否则会报错.

不能轻敌啊。。。这个题如果是面试的时候直接拿出来,还真不一定做的出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值