用java解决这个问题 ,控制时间复杂度在十的七次方以内。给定两个整数 a,b 。 请你计算,在 [a,b] 范围内有多少个整数满足其二进制表示恰好有一个 0 。 不考虑前导 0 。 例如,当 a=5,b=10 时,[5,10] 范围内的所有整数及其二进制表示如下: 510=1012,610=1102,710=1112,810=10002,910=10012,1010=10102 可以看出,只有 5 和 6 满足二进制表示恰好有一个 0 。 输入格式 共一行,两个整数 a,b 。 输出格式 一个整数,表示满足条件的整数数量。
时间: 2024-02-12 22:09:18 浏览: 297
以下是 Java 代码实现,时间复杂度为 O((b-a)*log(b)):
```java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(countNums(a, b));
}
private static int countNums(int a, int b) {
int cnt = 0;
for (int i = a; i <= b; i++) {
if (Integer.bitCount(i) == Integer.bitCount(i & (i - 1)) + 1) {
cnt++;
}
}
return cnt;
}
}
```
解释:
对于每个数,我们可以先计算它的二进制表示中 1 的个数,然后再计算它的二进制表示中恰好有一个 0 的个数。对于恰好有一个 0 的数,它的二进制表示中必定存在一个 0,且这个 0 的位置可以是任意的。
我们可以使用 i & (i - 1) 的技巧来去掉 i 的二进制表示中的最后一个 1,然后再将得到的数与 i 做与运算,得到的结果就是将 i 的二进制表示中的某一个 1 变成 0 后得到的数。我们可以枚举这个位置上是 0 还是 1,然后判断这个数的二进制表示中是不是恰好有一个 0。
需要注意的是,题目中要求不考虑前导 0,因此我们可以直接使用 Integer 类的 bitCount 方法来计算一个数的二进制表示中 1 的个数。
阅读全文