leetcode
leetcode 1351 ~ 1400
在区间范围内统计奇数数目

在区间范围内统计奇数数目

难度:

标签:

题目描述

代码结果

运行时间: 16 ms, 内存: 16.0 MB


/*
 * 思路:
 * 使用Java Stream API来计算范围内的奇数个数。
 * 1. 创建一个IntStream,范围从low到high。
 * 2. 使用filter方法筛选奇数。
 * 3. 使用count方法计算奇数个数。
 */

import java.util.stream.IntStream;

public class Solution {
    public long countOdds(int low, int high) {
        return IntStream.rangeClosed(low, high)
                        .filter(num -> num % 2 != 0)
                        .count();
    }
}

解释

方法:

题解采用直接计算法,利用数学的方式来确定区间内奇数的数量,而不是逐个检查每个数字。关键的思路是根据区间的端点是奇数还是偶数来决定如何计算。如果两个端点low和high都是偶数,那么奇数的个数为(high - low) / 2。如果任一端点为奇数,则需要将计算结果加一,因为包括至少一个端点的奇数在内。

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
如何准确地通过low和high的奇偶性来判断奇数的数量,能否具体解释其数学原理?
在给定的区间[low, high]内,如果区间两端low和high都是偶数,区间内奇数的数量等于(high - low) / 2。这是因为从一个偶数开始到另一个偶数结束,每两个数中恰好包含一个奇数。例如,从2到8的区间是2, 3, 4, 5, 6, 7, 8,其中奇数为3, 5, 7,共三个。如果其中一个或两个端点是奇数,那么区间内至少包括一个端点的奇数,因此计算公式调整为(high - low) // 2 + 1,以确保至少包括一个端点的奇数被计数。
🦆
在计算奇数数量时,如果low和high都是奇数,这种情况下为什么结果也是(high - low) // 2 + 1,能否详细解释这个计算过程?
当low和high都是奇数时,奇数的数量计算为(high - low) // 2 + 1。这是因为两个奇数之间的间隔包含了偶数和奇数的完整周期,每两个数包含一个奇数。由于我们从一个奇数开始并在另一个奇数结束,所以在整个计数中始终包括这两个奇数。例如,从3到7的区间是3, 4, 5, 6, 7,其中奇数为3, 5, 7,共三个,计算结果为(7 - 3) // 2 + 1 = 3。
🦆
题解中提到如果low和high一个是奇数一个是偶数,结果需要加一。这里是否隐含了low和high都包含在计算范围内,如果不包含high是否还需要加一?
确实,题解中的计算假设low和high都包含在计算范围内。如果high不包含在内,那么计算结果可能不同。例如,如果low是奇数而high是偶数,且high不包含在内,那么high前的最后一个数字是high-1,如果这是奇数,则计算结果不变;如果是偶数,则应减去1。因此,是否加1取决于high前的数字是否为奇数。
🦆
如果low和high的值非常接近,比如low=999999999和high=1000000000,这种方法与直接计算相比有什么优势?
当low和high非常接近时,直接计算法可能看起来更简单,因为只需检查一个或两个数字。然而,使用数学计算方法,无论low和high的差距多大,都可以快速得出结果,且计算复杂度始终为O(1)。这意味着计算时间不随区间大小而变化,尤其是对于大范围的区间,这种方法的效率更高,避免了遍历整个区间的需要。

相关问题