位运算-在区间范围内统计奇数数目
1523. 在区间范围内统计奇数数目
题目描述
给你两个非负整数 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~high 的奇数个数 - 0~low 的奇数个数
- 区间[0,x]中的奇数个数: $ pre = [\frac{x+1}{2}] $
- 故答案为 pre(high) - pre(low-1)
- low-1:不包含low
class Solution:
def countOdds(self, low: int, high: int) -> int:
pre = lambda x: (x + 1) >> 1
return pre(high) - pre(low - 1)
补充 '>>'
通过二进制移位运算符(<<, >>)实现 乘/除2
例如:
- 十进制1 --> 二进制 0000 0001
-
1 << 1 : 向左移动1位
0000 0001 --> 0000 0010 ( 2 ) # $ \times 2$ -
1 << 2 : 向左移动2位
0000 0001 --> 0000 0100 ( 4 ) # $ \times 2$ -
2 << 2 : 2向左移动2位
0000 0010 --> 0000 1000 ( 8 ) # $ \times 2$
- 十进制 9 --> 二进制 0000 1001
- 9 >> 1
0000 1001 --> 0000 0100 ( 4 ) - 9 >> 2
0000 1001 --> 0000 0010 ( 2 )
本题中的 \((x+1) >> 1\) 即 \((x+1)/2\)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-odd-numbers-in-an-interval-range
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。