解法一:模拟按位检查
对于每一个位置,有以下检查方式:
- 当前n是1,k是0,则
count + 1
- 当前n是0,k是1,则返回
不可实现
- 当前n和k相等,则
继续
在每一个位检查完毕后,如果没有return,则将k和n都右移1位
。
class Solution:
def minChanges(self, n: int, k: int) -> int:
cnt = 0
while n or k:
if n & 1 == 1 and k & 1 == 0:
cnt += 1
elif n & 1 == 0 and k & 1 == 1:
return -1
n >>= 1
k >>= 1
return cnt
Time:O(log(max(n, k))) Space: O(1)
解法二:位运算
如果n和k之间可以进行转换,则n按位与k
的结果是k
。(n的1可以变成0,但是k的不可以)。
在上面条件满足的时候,如果n和k之间可以进行转换,则n按位异或k
的结果中,在n和k不同的位置
上是1,其余位置是0,所以只需要统计结果中1的个数
即可。
class Solution:
def minChanges(self, n: int, k: int) -> int:
return (n ^ k).bit_count() if (n & k) == k else -1
其中bit_count()
是统计一个二进制中全部1的个数。
Time:O(1) Space:O(1)