给定两个数字n和k,我们需要通过翻转位来找到使给定数最大化所需的最小翻转次数,以使结果数恰好具有k个设置位。请注意,输入必须满足以下条件:k <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