📌  相关文章
📜  下一个比N大的数字,N的二进制表示形式仅相差一位(1)

📅  最后修改于: 2023-12-03 15:06:11.217000             🧑  作者: Mango

下一个比N大的数字,N的二进制表示形式仅相差一位

该问题可以解决以下两种情况:

  • 从右侧向左侧检查每个位以查找相邻的两个位,它们有不同的值。一旦发现这样的一对位,就将右边的那个位从0变为1,左边的那个位从1变为0。
  • 另一种解决方案是找到N的最右边的一个0位和下一个最右边的1位。将这两个位交换,然后将此位右侧的所有位设为0。

以下是第一种解决方案的Python实现:

def next_num(n):
    temp = n
    c0, c1 = 0, 0
  
    while (temp != 0) and (not (temp & 1)):
        c0 += 1
        temp >>= 1
    
    while (temp & 1):
        c1 += 1
        temp >>= 1
    
    # 如果n为0或全1,则没有比它大的数字满足条件。
    if c0 + c1 == 31 or c0 + c1 == 0:
        return -1

    p = c0 + c1
    n |= (1 << p)
    n &= ~((1 << p) - 1)
    n |= (1 << (c1 - 1)) - 1
  
    return n

以下是第二种解决方案的Python实现:

def next_num(n):
    c = n
    c0, c1 = 0, 0

    while (c & 1) == 1:
        c1 += 1
        c >>= 1
  
    if c == 0:
        return -1
    
    while ((c & 1) == 0) and (c != 0):
        c0 += 1
        c >>= 1
    
    p = c0 + c1
    n |= (1 << p)
    n &= ~((1 << p) - 1)
    n |= (1 << (c1 - 1)) - 1
  
    return n

以上两种解决方案的时间复杂度均为O(1),由于Python对于位运算的支持比较完善,因此实现起来非常简单。