题解 完美偶数计数 | 豆包MarsCode AI 刷题

53 阅读6分钟

一、题目分析

本题围绕 “完美偶数” 的定义展开,首先明确了 “完美偶数” 需满足两个条件:一是该数为偶数,二是其值处于给定的区间 [l, r] 之间。然后给出了一个长度为 n 的数组 a,任务是统计出这个数组中满足 “完美偶数” 定义的元素个数。

二、解题思路探讨

  1. 判断单个元素是否为完美偶数的思路
    要确定一个数是否是 “完美偶数”,需要分别验证它是否满足所设定的两个条件。

    • 对于偶数的判断,可以利用取余运算(在代码中通常用 % 运算符表示),如果一个数除以 2 的余数为 0,即 a % 2 == 0,那么这个数就是偶数。例如,4 % 2 = 0,所以 4 是偶数;而 5 % 2 = 1,则 5 不是偶数。

    • 接着判断该数是否处于区间 [l, r] 内,这可以通过简单的比较运算来实现,即 l <= i <= r。比如,给定区间 [3, 8],对于数字 5,需要判断 3 <= 5 <= 8 是否成立,成立则满足在该区间内这一条件。

只有当一个数同时满足上述两个条件时,它才是 “完美偶数”。

  1. 统计数组中完美偶数个数的策略
    遍历整个数组 a,对数组中的每一个元素,按照上述判断单个元素是否为完美偶数的方法进行验证。如果某个元素是 “完美偶数”,就对其进行计数。一种直观的实现方式就是使用循环遍历数组,并在循环内部进行条件判断和计数操作。

在代码实现中,采用了生成器表达式结合 sum 函数的方式来进行高效的统计。生成器表达式 (1 for i in a if is_even_number(i) and l <= i <= r) 的含义是,对于数组 a 中的每一个元素 i,如果它满足是偶数(通过调用 is_even_number 函数判断,其内部就是进行取余运算来确定是否为偶数)并且处于区间 [l, r] 内这两个条件,就生成一个值为 1 的元素,然后利用 sum 函数对这些生成的 1 进行求和,实际上就是统计满足条件的元素个数,这种方式代码简洁且高效。

三、具体解题步骤

  1. 定义判断偶数的函数
    首先定义了 is_even_number 函数,其功能是判断传入的参数 a 是否为偶数,通过返回 a % 2 == 0 的结果来实现这一判断。这个函数的作用就是将判断一个数是否为偶数的操作封装起来,方便后续在统计完美偶数个数的函数中调用,使代码结构更加清晰。

  2. 统计数组中完美偶数个数的函数实现
    在 solution 函数中进行主要的统计操作:

    • 函数接收四个参数,分别是数组的长度 n(虽然在函数内部实际统计时并没有直接使用这个参数,因为可以通过遍历数组 a 来间接获取元素个数,但它是题目描述中数组的一个属性,所以作为参数传入)、区间左端点 l、区间右端点 r 以及数组 a 本身。

    • 核心操作就是使用 sum 函数结合生成器表达式来统计满足条件的元素个数,即 sum(1 for i in a if is_even_number(i) and l <= i <= r)。这里详细解释一下这个表达式的执行过程:

      • for i in a 表示遍历数组 a 中的每一个元素 i

      • if is_even_number(i) and l <= i <= r 这部分是条件判断,对于每一个元素 i,先调用 is_even_number 函数判断它是否为偶数,然后再判断它是否处于区间 [l, r] 内,只有同时满足这两个条件时,该元素才符合 “完美偶数” 的定义。

      • 当元素满足条件时,生成器表达式就会生成一个值为 1 的元素,而 sum 函数会对这些生成的 1 进行求和,最终得到的和就是数组 a 中 “完美偶数” 的个数,将这个结果作为 solution 函数的返回值。

例如,对于样例 n = 5, l = 3, r = 8, a = [1, 2, 6, 8, 7]

  • 开始遍历数组 a,对于元素 1,它不满足是偶数的条件,所以不符合 “完美偶数” 定义,不会被计数。
  • 元素 2,它是偶数且 3 <= 2 <= 8 中的 3 <= 2 不成立,不在给定区间内,不符合定义,不计数。
  • 元素 6,是偶数且 3 <= 6 <= 8 成立,满足 “完美偶数” 定义,生成器表达式会为其生成一个 1,等待 sum 函数求和。
  • 元素 8,同样是偶数且在区间内,也会生成一个 1
  • 元素 7 不是偶数,不符合条件。
  • 最后 sum 函数对生成的 1(这里有两个 1,分别对应元素 6 和 8)进行求和,得到 2,也就是数组中 “完美偶数” 的个数,作为最终结果返回。
def is_even_number(a):
    return a % 2 == 0
 
def solution(n, l, r, a):
    # 计算在范围 [l, r] 内的偶数个数
    return sum(1 for i in a if is_even_number(i) and l <= i <= r)
 
if __name__ == "__main__":
    a1 = [1, 2, 6, 8, 7]
    print(solution(5, 3, 8, a1) == 2)  # 输出: True
 
    a2 = [12, 15, 18, 9]
    print(solution(4, 10, 20, a2) == 2)  # 输出: True
 
    a3 = [2, 4, 6]
    print(solution(3, 1, 10, a3) == 3)  # 输出: True

四、复杂度分析

  1. 时间复杂度
    整个解题过程主要的时间消耗在于遍历数组 a,遍历操作需要访问数组中的每一个元素,所以时间复杂度与数组 a 的长度 n 成正比,即时间复杂度为 。在遍历过程中进行的偶数判断以及区间判断操作都是常数时间复杂度的操作,不会影响整体的时间复杂度量级。
  2. 空间复杂度
    代码中使用的 is_even_number 函数内部只是进行简单的数值运算,没有额外使用大量的数据结构来存储数据。而在 solution 函数中,生成器表达式在生成元素时是逐个生成并传递给 sum 函数进行求和的,并没有一次性存储大量的数据,所以整体额外占用的空间是常数级别,空间复杂度为 (不考虑输入数组 a 本身所占用的空间)。