📜  第K个最小位数,具有k个设置位。

📅  最后修改于: 2021-04-28 16:48:04             🧑  作者: Mango

给定两个非负整数mk 。问题是找到具有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

方法:以下是步骤:

  1. 找出具有k个置位位数的最小数字。使其为num ,其中num =(1 << k)– 1。
  2. 循环m-1次,每次将num替换为比“ num”高的下一个更高编号,其位数与“ num”中的位数相同。请参阅此帖子以查找所需的下一个更大的数字。
  3. 最后返回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)