leetcode
leetcode 2101 ~ 2150
可被三整除的偶数的平均值

可被三整除的偶数的平均值

难度:

标签:

题目描述

代码结果

运行时间: 27 ms, 内存: 16.1 MB


/*
 * 思路:
 * 1. 使用 Java Stream 过滤出可以被 3 整除的偶数。
 * 2. 如果找不到满足条件的数,返回 0。
 * 3. 计算这些数的平均值,并向下取整。
 */
import java.util.Arrays;

public class Solution {
    public int averageOfEvenNumbersDivisibleByThree(int[] nums) {
        return (int) Math.floor(Arrays.stream(nums)
                .filter(num -> num % 3 == 0 && num % 2 == 0)
                .average()
                .orElse(0));
    }
}

解释

方法:

该题解的思路是遍历整数数组nums,对于每个数字,检查它是否是偶数且能被3整除。如果是,那么将它加到divisible_sum中,并且增加计数器count的值。遍历完成后,如果count为0,说明没有找到符合条件的数字,返回0;否则,返回divisible_sum除以count的结果,使用整数除法以确保结果向下取整。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么在定义符合条件的偶数时,同时需要满足能被2整除和能被3整除,而不是只检查能被6整除?
检查一个数是否能同时被2和3整除与检查这个数是否能被6整除是等价的,因为2和3是互质的,它们的最小公倍数是6。在编程实践中,直接检查能否被6整除同样有效。然而,分开检查可能使代码的意图更加明显,特别是对于初学者,这有助于理解数学概念如最小公倍数和互质关系。
🦆
在题解中,如果`nums`数组中所有数字都满足条件,`count`和`divisible_sum`会有什么特别的变化吗?
如果`nums`数组中所有数字都满足条件,即所有数字都是偶数且能被3整除,那么`count`的值将等于数组`nums`的长度,因为每个数字都会被计入计数器。同样,`divisible_sum`将是数组中所有这些数字的总和。这种情况下,算法将返回所有符合条件的数的平均值。
🦆
题解中提到如果`count`为0则返回0,这种情况下是否还需要检查`divisible_sum`的值?
不需要检查`divisible_sum`的值。如果`count`为0,意味着没有任何数字符合条件,因此`divisible_sum`自然也会是0,因为没有任何值被加入到总和中。在这种情况下,直接返回0是合理的,因为平均值的计算没有意义(即没有元素来计算平均)。
🦆
算法使用整数除法来确保结果向下取整,那么在有浮点数结果的情况下,使用`//`与使用`int()`函数有何不同?
在Python中,`//`运算符表示整数除法,总是会向下取整,返回两个数相除的整数部分,而不考虑结果的正负。而`int()`函数将浮点数转换成整数时,采用的是向零取整,即丢弃小数部分。例如,`5.9`用`int()`转换后为`5`,而使用`//`进行除法如`5.9 // 1`结果也为`5`。区别主要在于处理负数时,例如`-5.9 // 1`结果为`-6`,而`int(-5.9)`结果为`-5`。

相关问题