面试题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 语句去确定递归的终止条件,进而解决此问题。
以上就是本篇幅的主要内容,若您觉得文章可以,欢迎关注。