LeetCode 面试题64. 求1+2+…+n | Python

面试题64. 求1+2+…+n


题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/qiu-12n-lcof

题目


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

示例 1:

输入: n = 3
输出: 6

示例 2:

输入: n = 9
输出: 45

限制:

  • 1 <= n <= 10000

解题思路


在这道题目中,有许多的条件限制。我们先来看能够使用哪些办法来解决?例如:等差数列求和,迭代,递归

等差数列求和

先看等差数列求和,这里直接将公式套上就可以,直接看代码:

class Solution:
    def sumNums(self, n: int) -> int:
        return (1 + n) * n / 2

但是这里有个问题,这里使用了乘法和除法,先将这个办法排除。

迭代

使用迭代的话,要么使用 while 语句,要么使用 for 语句,这里同样被题目所限制,所以同样不可取。这里同样将代码贴出来,但是不采纳,仅阅读即可。

class Solution:
    def sumNums(self, n: int) -> int:
        ans = 0
        for i in range(1, n + 1):
            ans += i
        return ans
递归

正常来说,我们使用递归的方法都需要先设定终止条件,这里一定会用到条件语句 if,那这样,同样不符合题意。不过先看下如何实现:

class Solution:
    def sumNums(self, n: int) -> int:
        if n == 1:
            return 1
        n += sumNums(n-1)
        return n

我们知道,逻辑运算符有个短路性质。假设有条件 a、b,有这样的性质,对于表达式 a and b,如果 a 是 False 的话,那么 a and b,一定也是 False,所以不会去执行 b。

对于 a or b 这个表达式,如果 a 是 True,那么 a or b 也就能确定结果是 True,所以不会执行 b。

现在使用这个短路的性质,尝试修改递归方法的代码部分(使用 and 或者 or 都可以)。

具体代码如下。

代码实现


# code 1
class Solution:
    def __init__(self):
        self.ans = 0
    def sumNums(self, n: int) -> int:
        n == 1 or self.sumNums(n-1)
        self.ans += n
        return self.ans


# code 2
class Solution:
    def __init__(self):
        self.ans = 0
    def sumNums(self, n: int) -> int:
        n > 1 and self.sumNums(n-1)
        self.ans += n
        return self.ans

实现结果


实现结果

总结


  • 先罗列可以解决该问题的一些方法,例如:等差数列求和,迭代,递归;
  • 使用这些方法解决问题的同时,查看是否符合题意,不符合的剔除;
  • 递归的终止条件,一般情况下都会使用 if 条件进行判断,这里使用逻辑运算符的短路性质,替代 if 语句去确定递归的终止条件,进而解决此问题。

以上就是本篇幅的主要内容,若您觉得文章可以,欢迎关注。公众号《书所集录》同步更新,同样欢迎关注。

posted @ 2020-06-02 17:25  "大梦三千秋  阅读(192)  评论(0编辑  收藏  举报