友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

762. 二进制表示中质数个计算置位

给你两个整数 leftright,在闭区间 [left, right] 范围内,统计并返回 计算置位位数为质数 的整数个数。

计算置位位数 就是二进制表示中 1 的个数。

  • 例如, 21 的二进制表示 101013 个计算置位。

示例 1:

输入:left = 6, right = 10
输出:4
解释:
6 -> 110 (2 个计算置位,2 是质数)
7 -> 111 (3 个计算置位,3 是质数)
9 -> 1001 (2 个计算置位,2 是质数)
10-> 1010 (2 个计算置位,2 是质数)
共计 4 个计算置位为质数的数字。

示例 2:

输入:left = 10, right = 15
输出:5
解释:
10 -> 1010 (2 个计算置位, 2 是质数)
11 -> 1011 (3 个计算置位, 3 是质数)
12 -> 1100 (2 个计算置位, 2 是质数)
13 -> 1101 (3 个计算置位, 3 是质数)
14 -> 1110 (3 个计算置位, 3 是质数)
15 -> 1111 (4 个计算置位, 4 不是质数)
共计 5 个计算置位为质数的数字。

提示:

  • 1 <= left <= right <= 106

  • 0 <= right - left <= 104

思路分析

简单的位运算。

  • 一刷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2026-06-08 23:21:41
 */
public int countPrimeSetBits(int left, int right) {
  Map<Integer, Integer> map = new HashMap<>();
  for (int i = left; i <= right; i++) {
    int cnt = count(i);
    if (cnt < 2) {
      continue;
    }
    map.put(cnt, map.getOrDefault(cnt, 0) + 1);
  }
  int count = 0;
  for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
    if (isPrime(entry.getKey())) {
      count += entry.getValue();
    }
  }
  return count;
}

private boolean isPrime(int num) {
  for (int i = 2; i * i <= num; i++) {
    if (num % i == 0) {
      return false;
    }
  }
  return true;
}

private int count(int num) {
  int result = 0;
  while (num != 0) {
    result += (num & 1);
    num >>= 1;
  }
  return result;
}