C++ 给定数的每个数字频率的最接近的2的幂
本文描述了一种计算给定数的每个数字频率的最接近2的幂的方法。术语“频率”指的是数字中每个唯一数字的出现次数。
问题陈述
确定正整数N中每个数字的出现次数。然后,对于每个数字,找到其频率的最接近的2的幂。如果对于任何频率有两个最接近的2的幂,则打印较大的那个。
示例
输入
n = 677755
输出
5 -> 2
6 -> 1
7 -> 4
解释
对于 n = 677755,每个数字的频率为:
数字 5: 2
数字 6: 1
数字 7: 3
这些频率最近的2的幂是:
数字 5: 2
数字 6: 1
数字 7: 4
输入
n = 9990110466996
输出
1 -> 2
0 -> 2
4 -> 1
6 -> 4
9 -> 8
解释
对于n = 9990110466996,每个数字的频率如下:
数字6:3次
数字9:5次
数字4:1次
数字0:2次
数字1:2次
这些频率最接近2的幂次方的是:
数字0:2次
数字1:2次
数字4:1次
数字6:4次
数字9:8次
解决方法
这个任务的一个可行策略是利用一个map数据结构来存储给定数字中每个数字的出现频率,并将其调整为最接近的等于或大于2的幂次方。
伪代码
- 开始程序。
-
声明一个名为
n
的long long int
类型的变量,并进行初始化。 -
创建一个空的unordered_map
freq
来存储每个数字的频率。 -
对
n
的各个数字进行迭代,直到n
变为零,执行以下步骤:- 通过计算
n % 10
获得n
的最后一位数字。 -
通过使用
freq[digit]++
将该数字在freq
map中的频率增加1。 -
通过将其除以10(
n /= 10
)将最后一位数字从n
中删除。
- 通过计算
-
对
freq
map中的键值对进行迭代,执行以下步骤:- 对于每对键值对,声明一个名为
power
的整数变量,并将其设为1。 -
遍历2的幂次方,直到遇到比相应的频率值(it.second)大于或等于的幂次方:
-
将
power
乘以2(power *= 2
)。 -
打印数字(
it.first
)和最近的2的幂次方(power
)。
- 对于每对键值对,声明一个名为
-
结束程序。
示例:C++程序
在下面的C++程序中,我们输出给定数字中每个唯一数字的频率的最接近的2的幂次方。我们利用一个频率map来存储每个数字的实际出现次数,然后使用while循环来将频率调整为最接近的2的幂次方。
示例
// The following C++ program returns the closest power of 2 of the frequencies of each digit present in N.
#include <iostream>
#include <unordered_map>
#include <cmath>
using namespace std;
int main() {
long long int n;
n = 9990110466996;
// Declare a map to keep track of the frequency of each digit.
unordered_map<int, int> freq;
// Iterate over the input number and increment the frequency of each digit.
while (n) {
freq[n % 10]++;
n /= 10;
}
// Iterate over the map and print the nearest power of 2 for each frequency.
for (auto it : freq) {
// Declare a variable to store the nearest power of 2.
int power = 1;
// Iterate over the powers of 2 until we find a power that is greater than or equal to the frequency.
while (power < it.second) {
power *= 2;
}
// Print the digit and the nearest power of 2.
cout << it.first << " -> " << power << endl;
}
return 0;
}
输出
1 -> 2
0 -> 2
4 -> 1
6 -> 4
9 -> 8
时间和空间复杂度分析
时间复杂度: O(log n)
遍历输入数字并递增每个数字的频率需要 O(log n) 的时间,其中 n 表示输入数字。这是因为数字 n 的位数与 log n 成正比。
遍历映射并打印每个频率对应的最接近的2的幂次数需要 O(k) 的时间,其中 k 是输入数字中唯一数字的数量。在最坏情况下,可以将 k 视为常数。
空间复杂度: O(k)
创建一个无序映射来存储数字中每个数字的频率的空间复杂度与数字中唯一数字的数量成正比。在最坏情况下,空间复杂度是常数。
结论
本文介绍了一种确定给定数字中每个数字频率最接近的2的幂次数的方法。解决方案使用映射数据结构存储给定数字中每个数字的出现频率,并将其调整为最接近的大于或等于2的幂次数。
该解决方案的时间复杂度为 O(log n),空间复杂度为 O(k),其中 n 是输入数字的值,k 是输入数字中唯一数字的数量。实施这种方法相对简单。