面試題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 語句去確定遞歸的終止條件,進而解決此問題。
以上就是本篇幅的主要內容,若您覺得文章可以,歡迎關注。公衆號《書所集錄》同步更新,同樣歡迎關注。