📌  相关文章
📜  设置最多 K 位的最小整数,使得它们与 N 的按位 AND 最大(1)

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

题目概述

本题给定一个非负整数N以及一个正整数K,要求设置恰好K位,使得它们与N的按位AND最大。返回最大值。

算法分析

假设N的二进制表示有M位,那么可以发现在最高位到第K + 1位上都应该设置为1,第K位及以下全为0,即可使与N的按位AND最大。在实现时,从最高位开始,遍历所有位,若当前该位上的值为0,则将其设为1,同时将其低一位及以下都设为0,直至已经设置了K位。

代码实现

以下为Python实现代码:

def find_maximum_bitwise_and(N: int, K: int) -> int:
    bit_count = 0
    n = N
    while n > 0:
        n >>= 1
        bit_count += 1
    res = (1 << bit_count) - 1
    while K > 0:
        res &= ~(1 << (bit_count - 1))
        bit_count -= 1
        K -= 1
    return res & N

其中,bit_count表示N的二进制表示中的位数,初始化为0,遍历N的二进制表示位数的循环使用了位移运算符将第i位挪到最低位,然后将位数+1res初始化为所有位都是1,然后进行遍历,将最高的几位按照上述算法设为0,直至设置了K位。最后,将resN进行按位AND操作,即可得到最大值。

复杂度分析

在遍历N的二进制表示位数和设置最高几位为0时,算法的时间复杂度均为$O(logN)$。无额外的数据结构空间使用,空间复杂度为$O(1)$。

总结

本题考察了位运算的应用,主要是要从二进制的角度分析问题。设置二进制中的最高K位为1比暴力找到每一个与N按位AND的值再找最大值要更加高效,也是比较聪明的做法。