【Leetcode每日笔记】剑指 Offer 64. 求1+2+…+n(Python)

文章目录

  • 题目
  • 解题思路
    • 短路效应
    • 快速乘
  • 代码

题目

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

示例 1:

输入: n = 3 输出: 6

示例 2:

输入: n = 9 输出: 45

限制:

1 <= n <= 10000

解题思路

短路效应

常见的逻辑运算符有三种,即 “与 &&&&&& ”,“或 ∣∣||∣∣ ”,“非 !!! ” ;而其有重要的短路效应,如下所示:

if(A && B) // 若 A 为 false ,则 B 的判断不会执行(即短路),直接判定 A && B 为 false

if(A || B) // 若 A 为 true ,则 B 的判断不会执行(即短路),直接判定 A || B 为 true

本题需要实现 “当 n=1n = 1n=1 时终止递归” 的需求,可通过短路效应实现。

n > 1 && sumNums(n - 1) // 当 n = 1 时 n > 1 不成立 ,此时 “短路” ,终止后续递归

Python(2或3)的与(and)运算的返回值是这样的:
(1)如果多个变量均非0(包括None、False等),那么返回最后一个变量的值。如3 and 2 and ‘a’的返回值为’a’;
(2)如果多个变量中存在0值,则返回第一个0值。如1 and ‘a’ and 0 and None的返回值为0。

快速乘

在这里插入图片描述
就是把快速幂中的*换成+。

class Solution:
    def sumNums(self, n: int) -> int:
        ans = 0
        m = n+1
        while m!=0:
            if m&1!=0:
                ans += n
            n <<= n
            m >>= 1
        return ans>>1

代码

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

你可能感兴趣的:(LeetCode一周一结,leetcode,算法,python,操作符,快速乘)