在 C++ 中进行所需的最少翻转次数,以用 k 个设置的位数最大化数字。
问题表述
给出两个数字 n 和 k,我们需要通过翻转其位数找到最大化给定数字所需的最小翻转次数,使得结果数字恰好有 k 個设置的位数。请注意,输入必须满足条件 k 和 lt; 数字 n 中的位数。
示例
我们假设 n = 9 和 k = 2
9 的二进制表示为 − 1001。它包含 4 位。
具有 2 个设置位数的最大的 4 位二进制数字为 − 1100 即 12
要将 1001 转换成 1100,我们必须翻转高亮显示的 2 位
算法
1. Count the number of bits in n. Let us call this variable as bitCount. we can use log2(n) function from math library as fllows: bitCount = log2(n) + 1; 2. Find largest number with k set bits as follows: maxNum = pow(2, k) - 1; 3. Find the largest number possible with k set bits and having exactly same number of bits as n as follows: maxNum = maxNum << (bitCount - k); 4. Calculate (n ^ maxNum) and count number of set bits.
示例
#include <iostream>
#include <cmath>
using namespace std;
int getSetBits(int n){
int cnt = 0;
while (n) {
++cnt;
n = n & (n - 1);
}
return cnt;
}
int minFlipsRequired(int n, int k){
int bitCount, maxNum, flipCount;
bitCount = log2(n) + 1;
maxNum = pow(2, k) - 1;
maxNum = maxNum << (bitCount - k);
flipCount = n ^ maxNum;
return getSetBits(flipCount);
}
int main(){
cout << "Minimum required flips: " << minFlipsRequired(9, 2) << "\n";
return 0;
}输出
当你编译并执行以上程序时,它会产生以下输出 −
Minimum required flips: 2
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C #
MongoDB
MySQL
Javascript
PHP