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 語句去確定遞歸的終止條件,進而解決此問題。

以上就是本篇幅的主要內容,若您覺得文章可以,歡迎關注。公衆號《書所集錄》同步更新,同樣歡迎關注。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章