zoukankan      html  css  js  c++  java
  • 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 语句去确定递归的终止条件,进而解决此问题。

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

  • 相关阅读:
    “error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载)
    std::ostringstream 转std::string
    【转载】红外感应模块+蜂鸣器实现简易报警
    分割字符串使用空格
    优秀程序员的 18 大法则【转载】
    解决win10 iot VS编程出现的无法引用错误
    [转载] 程序员如何成功追到女神?
    win8/win10/win2012r2 存储池 冗余分析
    [转载][NAS] 使用win8的“存储池”功能~
    mySQL中删除unique key的语法 (删除某个字段的唯一性)
  • 原文地址:https://www.cnblogs.com/yiluolion/p/13032472.html
Copyright © 2011-2022 走看看