给定两个非负整数m和k 。问题是找到具有k个置位位数的第m个最小数。
约束: 1 <= m,k。
例子:
Input : m = 4, k = 2
Output : 9
(9)10 = (1001)2, it is the 4th smallest
number having 2 set bits.
Input : m = 6, k = 4
Output : 39
方法:以下是步骤:
- 找出具有k个置位位数的最小数字。使其为num ,其中num =(1 << k)– 1。
- 循环m-1次,每次将num替换为比“ num”高的下一个更高编号,其位数与“ num”中的位数相同。请参阅此帖子以查找所需的下一个更大的数字。
- 最后返回num 。
C++
// C++ implementation to find the mth smallest
// number having k number of set bits
#include
using namespace std;
typedef unsigned int uint_t;
// function to find the next higher number
// with same number of set bits as in 'x'
uint_t nxtHighWithNumOfSetBits(uint_t x)
{
uint_t rightOne;
uint_t nextHigherOneBit;
uint_t rightOnesPattern;
uint_t next = 0;
/* the approach is same as dicussed in
http://www.geeksforgeeks.org/next-higher-number-with-same-number-of-set-bits/
*/
if (x) {
rightOne = x & -(signed)x;
nextHigherOneBit = x + rightOne;
rightOnesPattern = x ^ nextHigherOneBit;
rightOnesPattern = (rightOnesPattern) / rightOne;
rightOnesPattern >>= 2;
next = nextHigherOneBit | rightOnesPattern;
}
return next;
}
// function to find the mth smallest number
// having k number of set bits
int mthSmallestWithKSetBits(uint_t m, uint_t k)
{
// smallest number having 'k'
// number of set bits
uint_t num = (1 << k) - 1;
// finding the mth smallest number
// having k set bits
for (int i = 1; i < m; i++)
num = nxtHighWithNumOfSetBits(num);
// required number
return num;
}
// Driver program to test above
int main()
{
uint_t m = 6, k = 4;
cout << mthSmallestWithKSetBits(m, k);
return 0;
}
Python3
# Python3 implementation to find the mth
# smallest number having k number of set bits
# function to find the next higher number
# with same number of set bits as in 'x'
def nxtHighWithNumOfSetBits(x):
rightOne = 0
nextHigherOneBit = 0
rightOnesPattern = 0
next = 0
""" the approach is same as dicussed in
http:#www.geeksforgeeks.org/next-higher-number-with-same-number-of-set-bits/
"""
if (x):
rightOne = x & (-x)
nextHigherOneBit = x + rightOne
rightOnesPattern = x ^ nextHigherOneBit
rightOnesPattern = (rightOnesPattern) // rightOne
rightOnesPattern >>= 2
next = nextHigherOneBit | rightOnesPattern
return next
# function to find the mth smallest
# number having k number of set bits
def mthSmallestWithKSetBits(m, k):
# smallest number having 'k'
# number of set bits
num = (1 << k) - 1
# finding the mth smallest number
# having k set bits
for i in range(1, m):
num = nxtHighWithNumOfSetBits(num)
# required number
return num
# Driver Code
if __name__ == '__main__':
m = 6
k = 4
print(mthSmallestWithKSetBits(m, k))
# This code is contributed by
# Shubham Singh(SHUBHAMSINGH10)
输出:
39
时间复杂度: O(m)