Given a positive integer N, the task is to print the nearest power of 2 of the frequencies of each digit present in N. If there exists two nearest powers of 2 for any frequency, print the larger one.
Examples:
Input: N = 344422
Output:
2 -> 2
3 -> 1
4 -> 4
Explanation:
Frequency of the digit 3 is 1. Nearest power of 2 is 1.
Frequency of the digit 4 is 3. Nearest power of 2 is 4.
Frequency of the digit 2 is 2. Nearest power of 2 is 2.Input: N = 16333331163
Output:
3 -> 8
1 -> 4
6 -> 2
Approach: The given problem can be solved using Hashing. Follow the steps below to solve the given problem:
- Initialize a string, say S and convert the given integer N and store it in the string S.
- Traverse the string S and store the frequency of each character in a Map, say M.
- Now, traverse the Map M and print the nearest power of 2 of the frequency of each digit stored in the Map.
Below is the implementation of the above approach:
// C++ program for the above approach #include <bits/stdc++.h> using namespace std;
// Function to find the nearest power of // 2 for all frequencies in the Map freq void nearestPowerOfTwoUtil(
unordered_map< char , int >& freq)
{ // Traverse the Map
for ( auto & it : freq) {
cout << it.first << " -> " ;
// Calculate log of the
// current array element
int lg = log2(it.second);
int a = pow (2, lg);
int b = pow (2, lg + 1);
// Find the nearest power of 2
// for the current frequency
if ((it.second - a)
< (b - it.second)) {
cout << a << endl;
}
else {
cout << b << endl;
}
}
} // Function to find nearest power of 2 // for frequency of each digit of num void nearestPowerOfTwo(string& S)
{ // Length of string
int N = S.size();
// Stores the frequency of each
// character in the string
unordered_map< char , int > freq;
// Traverse the string S
for ( int i = 0; i < N; i++) {
freq[S[i]]++;
}
// Function call to generate
// nearest power of 2 for each
// frequency
nearestPowerOfTwoUtil(freq);
} // Driver Code int main()
{ string N = "16333331163" ;
nearestPowerOfTwo(N);
return 0;
} |
// Java program for the above approach import java.io.*;
import java.lang.*;
import java.util.*;
class GFG {
// Function to find the nearest power of
// 2 for all frequencies in the Map freq
static void nearestPowerOfTwoUtil(HashMap<Character, Integer> freq)
{
// Traverse the Map
for ( char key : freq.keySet())
{
System.out.print(key + " -> " );
// Calculate log of the
// current array element
int lg = ( int )(Math.log(freq.get(key) / Math.log( 2 )));
int a = ( int )Math.pow( 2 , lg);
int b = ( int )Math.pow( 2 , lg + 1 );
// Find the nearest power of 2
// for the current frequency
if ((freq.get(key) - a) < (b - freq.get(key))) {
System.out.println(a);
}
else {
System.out.println(b);
}
}
}
// Function to find nearest power of 2
// for frequency of each digit of num
static void nearestPowerOfTwo(String S)
{
// Length of string
int N = S.length();
// Stores the frequency of each
// character in the string
HashMap<Character, Integer> freq = new HashMap<>();
// Traverse the string S
for ( int i = 0 ; i < N; i++)
{
freq.put(S.charAt(i), freq.getOrDefault(S.charAt(i), 0 ) + 1 );
}
// Function call to generate
// nearest power of 2 for each
// frequency
nearestPowerOfTwoUtil(freq);
}
// Driver Code
public static void main(String[] args)
{
String N = "16333331163" ;
nearestPowerOfTwo(N);
}
} // This code is contributed by Kingash. |
# Python3 program for the above approach from math import log2, pow
# Function to find the nearest power of # 2 for all frequencies in the Map freq def nearestPowerOfTwoUtil(freq):
# Traverse the Map
temp = {}
for key,value in freq.items():
# Calculate log of the
# current array element
lg = int (log2(value))
a = int ( pow ( 2 , lg))
b = int ( pow ( 2 , lg + 1 ))
# Find the nearest power of 2
# for the current frequency
if ((value - a) < (b - value)):
temp[( int (a))] = key
else :
temp[( int (b))] = key
for key,value in temp.items():
print (value, "->" ,key)
# Function to find nearest power of 2 # for frequency of each digit of num def nearestPowerOfTwo(S):
# Length of string
N = len (S)
# Stores the frequency of each
# character in the string
freq = {}
# Traverse the string S
for i in range (N):
if (S[i] in freq):
freq[S[i]] + = 1
else :
freq[S[i]] = 1
# Function call to generate
# nearest power of 2 for each
# frequency
nearestPowerOfTwoUtil(freq)
# Driver Code if __name__ = = '__main__' :
N = "16333331163"
nearestPowerOfTwo(N)
# This code is contributed by bgangwar59.
|
// C# program for the above approach using System;
using System.Collections.Generic;
class GFG{
// Function to find the nearest power of // 2 for all frequencies in the Map freq static void nearestPowerOfTwoUtil(
Dictionary< char , int > freq)
{ // Traverse the Map
foreach (KeyValuePair< char , int > entry in freq)
{
char key = entry.Key;
Console.Write(key + " -> " );
// Calculate log of the
// current array element
int lg = ( int )(Math.Log(freq[key] /
Math.Log(2)));
int a = ( int )Math.Pow(2, lg);
int b = ( int )Math.Pow(2, lg + 1);
// Find the nearest power of 2
// for the current frequency
if ((freq[key] - a) < (b - freq[key]))
{
Console.Write(a + "\n" );
}
else
{
Console.Write(b + "\n" );
}
}
} // Function to find nearest power of 2 // for frequency of each digit of num static void nearestPowerOfTwo( string S)
{ // Length of string
int N = S.Length;
// Stores the frequency of each
// character in the string
Dictionary< char ,
int > freq = new Dictionary< char ,
int >();
// Traverse the string S
for ( int i = 0; i < N; i++)
{
if (freq.ContainsKey(S[i]))
freq[S[i]] += 1;
else
freq[S[i]] = 1;
}
// Function call to generate
// nearest power of 2 for each
// frequency
nearestPowerOfTwoUtil(freq);
} // Driver Code public static void Main()
{ string N = "16333331163" ;
nearestPowerOfTwo(N);
} } // This code is contributed by ipg2016107 |
<script> // Javascript program for the above approach // Function to find the nearest power of // 2 for all frequencies in the Map freq function nearestPowerOfTwoUtil(freq)
{ // Traverse the Map
freq.forEach((value, key) => {
document.write( key + " -> " );
// Calculate log of the
// current array element
var lg = parseInt(Math.log2(value));
var a = Math.pow(2, lg);
var b = Math.pow(2, lg + 1);
// Find the nearest power of 2
// for the current frequency
if ((value - a)
< (b - value)) {
document.write( a + "<br>" );
}
else {
document.write( b + "<br>" );
}
});
} // Function to find nearest power of 2 // for frequency of each digit of num function nearestPowerOfTwo(S)
{ // Length of string
var N = S.length;
// Stores the frequency of each
// character in the string
var freq = new Map();
// Traverse the string S
for ( var i = 0; i < N; i++) {
if (freq.has(S[i]))
{
freq.set(S[i], freq.get(S[i])+1)
}
else
{
freq.set(S[i], 1)
}
}
// Function call to generate
// nearest power of 2 for each
// frequency
nearestPowerOfTwoUtil(freq);
} // Driver Code var N = "16333331163" ;
nearestPowerOfTwo(N); </script> |
3 -> 8 1 -> 4 6 -> 2
Time Complexity: O(log10N)
Auxiliary Space: O(1)