📅  最后修改于: 2023-12-03 15:06:11.217000             🧑  作者: Mango
该问题可以解决以下两种情况:
以下是第一种解决方案的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对于位运算的支持比较完善,因此实现起来非常简单。