chore(Java): add Count Set Bits (#600)
parent
3c973a8a52
commit
df69cbbfb3
|
@ -83,3 +83,6 @@
|
||||||
|
|
||||||
## Backtracking
|
## Backtracking
|
||||||
- [N Queen Problem](backtracking/nqueen.java)
|
- [N Queen Problem](backtracking/nqueen.java)
|
||||||
|
|
||||||
|
## Bit Manipulation
|
||||||
|
- [Count Set Bits](bit-manipulation/count-set-bits.java)
|
||||||
|
|
|
@ -0,0 +1,83 @@
|
||||||
|
/** Problem Description :
|
||||||
|
* You are given a number N. Find the total count of set bits for all numbers from 1 to N
|
||||||
|
* including 1 and N
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Author : Suraj Kumar
|
||||||
|
* Github : https://github.com/skmodi649
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** ALGORITHM :
|
||||||
|
* So, we will iterate till the number of bits in the number.
|
||||||
|
* And we don’t have to iterate every single number in the range from 1 to n.
|
||||||
|
* We will perform the following operations to get the desired result.
|
||||||
|
* The quotient when n+1 is divided by 2 will return the number of times the 0,1 pattern has appeared at LSB.
|
||||||
|
* However, the quotient when n+1 is divided by 4 will return the number of times the 0,0,1,1 pattern has
|
||||||
|
* appeared at 2nd least significant bit and so on.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** TEST CASES :
|
||||||
|
* Test Case 1 :
|
||||||
|
* Input: N = 4
|
||||||
|
* Output: 5
|
||||||
|
*
|
||||||
|
* Test Case 2 :
|
||||||
|
* Input: N = 17
|
||||||
|
* Output: 35
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.lang.*;
|
||||||
|
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
|
||||||
|
//Function to return sum of count of set bits in the integers from 1 to n.
|
||||||
|
public static int countSetBits(int n) {
|
||||||
|
int count = 0 , i = 1 , val = 0;
|
||||||
|
while ((n + 1) / (int) Math.pow(2, i) != 0) {
|
||||||
|
int k = (n + 1) % (int) Math.pow(2, i);
|
||||||
|
val = (n + 1) / (int) Math.pow(2, i);
|
||||||
|
int c = (int) Math.pow(2, i - 1);
|
||||||
|
count = count + c * val;
|
||||||
|
if (k > ((int) Math.pow(2, i) / 2)) {
|
||||||
|
count = count + (k - ((int) Math.pow(2, i) / 2));
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
int temp = (int) Math.pow(2, i);
|
||||||
|
count += (n + 1 - temp / 2);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args){
|
||||||
|
Scanner sc = new Scanner(System.in);
|
||||||
|
System.out.println("Enter the number :");
|
||||||
|
int n = sc.nextInt();//input n
|
||||||
|
|
||||||
|
Solution obj = new Solution();
|
||||||
|
System.out.println("Total set bits : "+obj.countSetBits(n)); // calling countSetBits method
|
||||||
|
System.out.println(); // changing the line
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** Explanation for N = 4
|
||||||
|
* For numbers from 1 to 4.
|
||||||
|
* For 1: 0 0 1 = 1 set bits
|
||||||
|
* For 2: 0 1 0 = 1 set bits
|
||||||
|
* For 3: 0 1 1 = 2 set bits
|
||||||
|
* For 4: 1 0 0 = 1 set bits
|
||||||
|
* Therefore, the total set bits is 5.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** Time Complexity : O(log N)
|
||||||
|
* Auxiliary Space Complexity : O(1)
|
||||||
|
* Constraints : 1 ≤ N ≤ 10^8
|
||||||
|
*/
|
Loading…
Reference in New Issue