762. Prime Number of Set Bits in Binary Representation
leetcode
#bit-manipulation#csharp#leetcode#math#two-pointers
Task
: hard
Если даны два целых числа left и right, верните количество чисел в диапазоне [left, right], имеющих простое число битов в двоичном представлении. Напомним, что число битов в двоичном представлении - это количество единиц, присутствующих в числе 1. Например, 21 в двоичном представлении - это 10101, которое имеет 3 бита.
Пример:
Input: left = 10, right = 15
Output: 5
C# solution
matched/originalpublic class Solution {
public int CountPrimeSetBits(int left, int right) {
int count = 0;
for (int num = left; num <= right; num++) {
if (IsPrime(BitCount(num))) {
count++;
}
}
return count;
}
private int BitCount(int x) {
int count = 0;
while (x > 0) {
count += x & 1;
x >>= 1;
}
return count;
}
private bool IsPrime(int x) {
if (x < 2) return false;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return false;
}
return true;
}
}C++ solution
auto-draft, review before submit#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public int CountPrimeSetBits(int left, int right) {
int count = 0;
for (int num = left; num <= right; num++) {
if (IsPrime(BitCount(num))) {
count++;
}
}
return count;
}
private int BitCount(int x) {
int count = 0;
while (x > 0) {
count += x & 1;
x >>= 1;
}
return count;
}
private bool IsPrime(int x) {
if (x < 2) return false;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return false;
}
return true;
}
}Java solution
matched/originalpublic class Solution {
public int countPrimeSetBits(int left, int right) {
int count = 0;
for (int num = left; num <= right; num++) {
if (isPrime(Integer.bitCount(num))) {
count++;
}
}
return count;
}
private boolean isPrime(int x) {
if (x < 2) return false;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return false;
}
return true;
}Python solution
matched/originaldef countPrimeSetBits(left, right):
def countBits(x):
return bin(x).count('1')
def isPrime(x):
if x < 2:
return False
for i in range(2, int(x ** 0.5) + 1):
if x % i == 0:
return False
return True
count = 0
for num in range(left, right + 1):
if isPrime(countBits(num)):
count += 1Go solution
matched/originalpackage main
import (
"math"
"strconv"
)
func countPrimeSetBits(left int, right int) int {
count := 0
for num := left; num <= right; num++ {
if isPrime(bitCount(num)) {
count++
}
}
return count
}
func bitCount(x int) int {
return strconv.FormatInt(int64(x), 2)
}
func isPrime(x int) bool {
if x < 2 {
return false
}
for i := 2; i <= int(math.Sqrt(float64(x))); i++ {
if x % i == 0 {
return false
}
}
return true
}Explanation
Algorithm
Создайте функцию для подсчета количества единиц в двоичном представлении числа.
Создайте функцию для проверки, является ли число простым.
Пройдите через все числа в диапазоне [left, right] и подсчитайте числа, у которых количество битов в двоичном представлении является простым числом.
😎