位运算-在区间范围内统计奇数数目

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] 。

官方题解

  1. 0~high 的奇数个数 - 0~low 的奇数个数
  2. 区间[0,x]中的奇数个数: $ pre = [\frac{x+1}{2}] $
  3. 故答案为 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. 十进制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$

  1. 十进制 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

posted @ 2022-03-23 10:15  ArdenWang  阅读(133)  评论(0编辑  收藏  举报