跳至主要內容

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


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

🟢   🔖  数学  🔗 力扣open in new window LeetCodeopen in new window

题目

Given two non-negative integers low and high. Return the count of odd numbers betweenlow and high _ (inclusive)_.

Example 1:

Input: low = 3, high = 7

Output: 3

Explanation: The odd numbers between 3 and 7 are [3,5,7].

Example 2:

Input: low = 8, high = 10

Output: 1

Explanation: The odd numbers between 8 and 10 are [9].

Constraints:

  • 0 <= low <= high <= 10^9

题目大意

给你两个非负整数 lowhigh 。请你返回 lowhigh 之间(包括二者)奇数的数目。

示例 1:

输入: low = 3, high = 7

输出: 3

解释: 3 到 7 之间奇数数字为 [3,5,7] 。

示例 2:

输入: low = 8, high = 10

输出: 1

解释: 8 到 10 之间奇数数字为 [9] 。

提示:

  • 0 <= low <= high <= 10^9

解题思路

  1. 奇数的范围调整

    • 为了方便计算奇数的个数,我们可以将 lowhigh 都调整为偶数。
    • 若原始的 lowhigh 已经是偶数,不作调整。
    • low 是奇数,将 low 调整为前一个偶数(减 1)
    • high 是奇数,将 high 调整为后一个偶数(加 1)。
  2. 奇数个数的计算

    • 调整后奇数的个数可以通过公式计算:奇数个数 = (high - low) / 2
    • 调整的目的是确保所有奇数都在 [low, high] 这个范围内,不会遗漏或多算。

复杂度分析

  • 时间复杂度O(1),所有操作均为常数时间操作。
  • 空间复杂度O(1),仅使用常数变量。

代码

/**
 * @param {number} low
 * @param {number} high
 * @return {number}
 */
var countOdds = function (low, high) {
	if (low % 2 != 0) {
		// 若 low 是奇数,调整为前一个偶数
		low -= 1;
	}
	if (high % 2 != 0) {
		// 若 high 是奇数,调整为后一个偶数
		high += 1;
	}
	return (high - low) / 2; // 奇数个数为调整后范围的长度的一半
};

相关题目

题号标题题解标签难度力扣
2980检查按位或是否存在尾随零位运算 数组🟢🀄️open in new window 🔗open in new window