Occurrences of a pattern in binary representation of a number
Given a string pat and an integer N, the task is to find the number of occurrences of the pattern pat in binary representation of N.
Examples:
Input: N = 2, pat = “101”
Output: 0
Pattern “101” doesn’t occur in the binary representation of 2 (10).
Input: N = 10, pat = “101”
Output: 1
Binary representation of 10 is 1010 and the given pattern occurs only once.
Naive Approach: Convert the number into its binary string representation and then use a pattern matching algorithm to check the number of times the pattern has occurred in the binary representation.
Efficient Approach:
- Convert the binary pattern into it’s decimal representation.
- Take an integer all_ones, whose binary representation consists of all set bits (equal to the number of bits in the pattern).
- Performing N & all_ones now will leave only the last k bits unchanged (others will be 0) where k is the number of bits in the pattern.
- Now if N = pattern, it means that N contained the pattern in the end in its binary representation. So update count = count + 1.
- Right shift N by 1 and repeat the previous two steps until N ? pattern & N > 0.
- Print the count in the end.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int countPattern( int n, string pat)
{
int pattern_int = 0;
int power_two = 1;
int all_ones = 0;
for ( int i = pat.length() - 1; i >= 0; i--) {
int current_bit = pat[i] - '0' ;
pattern_int += (power_two * current_bit);
all_ones = all_ones + power_two;
power_two = power_two * 2;
}
int count = 0;
while (n && n >= pattern_int) {
if ((n & all_ones) == pattern_int) {
count++;
}
n = n >> 1;
}
return count;
}
int main()
{
int n = 500;
string pat = "10" ;
cout << countPattern(n, pat);
}
|
Java
import java.util.*;
class solution
{
static int countPattern( int n, String pat)
{
int pattern_int = 0 ;
int power_two = 1 ;
int all_ones = 0 ;
for ( int i = pat.length() - 1 ; i >= 0 ; i--) {
int current_bit = pat.charAt(i) - '0' ;
pattern_int += (power_two * current_bit);
all_ones = all_ones + power_two;
power_two = power_two * 2 ;
}
int count = 0 ;
while (n!= 0 && n >= pattern_int) {
if ((n & all_ones) == pattern_int) {
count++;
}
n = n >> 1 ;
}
return count;
}
public static void main(String args[])
{
int n = 500 ;
String pat = "10" ;
System.out.println(countPattern(n, pat));
}
}
|
Python3
def countPattern(n, pat):
pattern_int = 0
power_two = 1
all_ones = 0
i = len (pat) - 1
while (i > = 0 ):
current_bit = ord (pat[i]) - ord ( '0' )
pattern_int + = (power_two * current_bit)
all_ones = all_ones + power_two
power_two = power_two * 2
i - = 1
count = 0
while (n ! = 0 and n > = pattern_int):
if ((n & all_ones) = = pattern_int):
count + = 1
n = n >> 1
return count
if __name__ = = '__main__' :
n = 500
pat = "10"
print (countPattern(n, pat))
|
C#
using System ;
class GFG
{
static int countPattern( int n, string pat)
{
int pattern_int = 0;
int power_two = 1;
int all_ones = 0;
for ( int i = pat.Length - 1; i >= 0; i--)
{
int current_bit = pat[i] - '0' ;
pattern_int += (power_two * current_bit);
all_ones = all_ones + power_two;
power_two = power_two * 2;
}
int count = 0;
while (n != 0 && n >= pattern_int)
{
if ((n & all_ones) == pattern_int)
{
count++;
}
n = n >> 1;
}
return count;
}
public static void Main()
{
int n = 500;
string pat = "10" ;
Console.WriteLine(countPattern(n, pat));
}
}
|
PHP
<?php
function countPattern( $n , $pat )
{
$pattern_int = 0;
$power_two = 1;
$all_ones = 0;
for ( $i = strlen ( $pat ) - 1; $i >= 0; $i --)
{
$current_bit = $pat [ $i ] - '0' ;
$pattern_int += ( $power_two * $current_bit );
$all_ones = $all_ones + $power_two ;
$power_two = $power_two * 2;
}
$count = 0;
while ( $n && $n >= $pattern_int )
{
if (( $n & $all_ones ) == $pattern_int )
{
$count ++;
}
$n = $n >> 1;
}
return $count ;
}
$n = 500;
$pat = "10" ;
echo countPattern( $n , $pat );
?>
|
Javascript
<script>
function countPattern( n, pat)
{
let pattern_int = 0;
let power_two = 1;
let all_ones = 0;
for (let i = pat.length - 1; i >= 0; i--) {
let current_bit = pat.charAt(i) - '0' ;
pattern_int += (power_two * current_bit);
all_ones = all_ones + power_two;
power_two = power_two * 2;
}
let count = 0;
while (n!=0 && n >= pattern_int) {
if ((n & all_ones) == pattern_int) {
count++;
}
n = n >> 1;
}
return count;
}
let n = 500;
let pat = "10" ;
document.write(countPattern(n, pat));
</script>
|
Complexity Analysis:
- Time Complexity: O(N)
- Auxiliary Space: O(1)
Last Updated :
13 Sep, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...