← Static tasks

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/original
public 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/original
public 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/original
def 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 += 1

Go solution

matched/original
package 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] и подсчитайте числа, у которых количество битов в двоичном представлении является простым числом.

😎