1523.在区间范围内统计奇数数目:两种方法O(1)算

【LetMeFly】1523.在区间范围内统计奇数数目:两种方法O(1)算

力扣题目链接:https://leetcode.cn/problems/count-odd-numbers-in-an-interval-range/

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

 

示例 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

解题方法一:思考容易写着麻烦点

low和high都是偶数的示例 2:low = 8, high = 10,中间共有几个奇数?

答案是$\frac{10-8}2$个。

如果low是奇数,那么我们令low-1;如果high是奇数,那么我们就令high+1就好了。

  • 时间复杂度$O(1)$
  • 空间复杂度$O(1)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
* @LastEditTime: 2026-02-19 17:39:31
*/
class Solution {
public:
int countOdds(int low, int high) {
if (low % 2) {
low--;
}
if (high % 2) {
high++;
}
return (high - low) >> 1;
}
};

Python

1
2
3
4
5
6
7
8
9
10
'''
LastEditTime: 2026-02-19 18:00:11
'''
class Solution:
def countOdds(self, low: int, high: int) -> int:
if low % 2:
low -= 1
if high % 2:
high += 1
return (high - low) // 2

Go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*
* @LastEditTime: 2026-02-19 18:02:40
*/
package main

func countOdds(low int, high int) int {
if low % 2 == 1 {
low--
}
if high % 2 == 1 {
high++
}
return (high - low) / 2
}

解题方法二:思考麻烦点写着容易

不论一个数的奇偶性:

  • $[1, low)$ 共有几个奇数?答案是$\lfloor\frac{low}2\rfloor$个;
  • $[1, high]$ 共有几个奇数?答案是$\lfloor\frac{high+1}2\rfloor$个。

那么 $[low, high]$ 共有几个奇数? $[1, high] - [1, low)$ 即为所得。

  • 时间复杂度$O(1)$
  • 空间复杂度$O(1)$

AC代码

Java

1
2
3
4
5
6
7
8
/*
* @LastEditTime: 2026-02-19 18:04:04
*/
class Solution {
public int countOdds(int low, int high) {
return (high + 1) / 2 - low / 2;
}
}

Rust

1
2
3
4
5
6
7
8
/*
* @LastEditTime: 2026-02-19 18:06:07
*/
impl Solution {
pub fn count_odds(low: i32, high: i32) -> i32 {
(high + 1) / 2 - low / 2
}
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源


1523.在区间范围内统计奇数数目:两种方法O(1)算
https://blog.letmefly.xyz/2026/02/19/LeetCode 1523.在区间范围内统计奇数数目/
作者
发布于
2026年2月19日
许可协议