给定一个字符串pat和一个整数N ,任务是查找N的二进制表示形式pat的出现次数。
例子:
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.
天真的方法:将数字转换为其二进制字符串表示形式,然后使用模式匹配算法检查二进制表示形式中出现模式的次数。
高效方法:
- 将二进制模式转换为其十进制表示形式。
- 取一个整数all_ones ,其二进制表示形式包括所有设置的位(等于模式中的位数)。
- 现在执行N&all_ones将只保留最后k个位不变(其他位将为0),其中k是模式中的位数。
- 现在,如果N = pattern ,则意味着N最终以二进制表示形式包含该模式。因此,更新计数=计数+ 1 。
- 将N右移1并重复前两个步骤,直到N≥pattern且N> 0 。
- 最后打印计数。
下面是上述方法的实现:
C++
// C++ program to find the number of times
// pattern p occurred in binary representation
// on n.
#include
using namespace std;
// Function to return the count of occurrence
// of pat in binary representation of n
int countPattern(int n, string pat)
{
// To store decimal value of the pattern
int pattern_int = 0;
int power_two = 1;
// To store a number that has all ones in
// its binary representation and length
// of ones equal to length of the pattern
int all_ones = 0;
// Find values of pattern_int and all_ones
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 the pattern occurs in the last
// digits of n
if ((n & all_ones) == pattern_int) {
count++;
}
// Right shift n by 1 bit
n = n >> 1;
}
return count;
}
// Driver code
int main()
{
int n = 500;
string pat = "10";
cout << countPattern(n, pat);
}
Java
// Java program to find the number of times
// pattern p occurred in binary representation
// on n.
import java.util.*;
class solution
{
// Function to return the count of occurrence
// of pat in binary representation of n
static int countPattern(int n, String pat)
{
// To store decimal value of the pattern
int pattern_int = 0;
int power_two = 1;
// To store a number that has all ones in
// its binary representation and length
// of ones equal to length of the pattern
int all_ones = 0;
// Find values of pattern_int and all_ones
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 the pattern occurs in the last
// digits of n
if ((n & all_ones) == pattern_int) {
count++;
}
// Right shift n by 1 bit
n = n >> 1;
}
return count;
}
// Driver code
public static void main(String args[])
{
int n = 500;
String pat = "10";
System.out.println(countPattern(n, pat));
}
}
Python3
# Python 3 program to find the number of times
# pattern p occurred in binary representation
# on n.
# Function to return the count of occurrence
# of pat in binary representation of n
def countPattern(n, pat):
# To store decimal value of the pattern
pattern_int = 0
power_two = 1
# To store a number that has all ones in
# its binary representation and length
# of ones equal to length of the pattern
all_ones = 0
# Find values of pattern_int and all_ones
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 the pattern occurs in the last
# digits of n
if ((n & all_ones) == pattern_int):
count += 1
# Right shift n by 1 bit
n = n >> 1
return count
# Driver code
if __name__ == '__main__':
n = 500
pat = "10"
print(countPattern(n, pat))
# This code is contributed by
# Surendra_Gangwar
C#
// C# program to find the number of times
// pattern p occurred in binary representation
// on n.
using System ;
class GFG
{
// Function to return the count of occurrence
// of pat in binary representation of n
static int countPattern(int n, string pat)
{
// To store decimal value of the pattern
int pattern_int = 0;
int power_two = 1;
// To store a number that has all ones in
// its binary representation and length
// of ones equal to length of the pattern
int all_ones = 0;
// Find values of pattern_int and all_ones
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 the pattern occurs in the last
// digits of n
if ((n & all_ones) == pattern_int)
{
count++;
}
// Right shift n by 1 bit
n = n >> 1;
}
return count;
}
// Driver code
public static void Main()
{
int n = 500;
string pat = "10";
Console.WriteLine(countPattern(n, pat));
}
}
// This code is contributed by Ryuga
PHP
= 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 the pattern occurs in the last
// digits of $n
if (($n & $all_ones) == $pattern_int)
{
$count++;
}
// Right shift $n by 1 bit
$n = $n >> 1;
}
return $count;
}
// Driver code
$n = 500;
$pat = "10";
echo countPattern($n, $pat);
// This code is contributed by ihritik
?>
输出:
2
想要从精选的最佳视频中学习并解决问题,请查看有关从基础到高级C++的C++基础课程以及有关语言和STL的C++ STL课程。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。