面试题 05.04. 下一个数
面试题 05.04. 下一个数
提示
中等
62
相关企业
下一个数。给定一个正整数,找出与其二进制表达式中1的个数相同且大小最接近的那两个数(一个略大,一个略小)。
示例1:
输入:num = 2(或者0b10)
输出:[4, 1] 或者([0b100, 0b1])
示例2:
输入:num = 1
输出:[2, -1]
class Solution:
def findClosedNumbers(self, num: int) -> List[int]:
# 1特判
if num == 1:
return [2, -1]
'''
如何找一个大数?
思路:
将num二进制最低位的1进一位得到a,之后将num中发生进位的1挪到最后,
再将先进位的最后一位1向后移动一位,将a和b的结果使用或运算合并
例如 0001 0110
1.通过t=num & -num 找到最低位1所在的位 0000 0010
y=num+t让最后一位发生进位 0001 1000
2.将进位的1挪到最后,再将先进位的1向右挪一位,去掉
0000 0001
larger = (num & ~y) // t >> 1
3.将y和larger组合
0001 1001
'''
# 例如0001 0111 -> 0001 1011
def next_combo(num):
# 获取最低位1的位权 0000 0001
t = num & -num
# 将最低位的1进一位 0001 1000
y = num + t
# num & ~y 获取发生进位的1的序列 0000 0111
# (num & ~y)//t 将发生进位的最低位1挪到最右边,再向右移动一位,保证1的数目不变 0000 0011
larger = (num & ~y)//t >> 1
# 两个结果取或 0001 1011
return larger|y
mx=next_combo(num)
mn=~next_combo(~num)
if mx>2147483647: mx=-1
if mn==0: mn=-1
return [mx,mn]