1. 解题思路
这道题坦率地说其实不太想写这篇题解,因为其实自己根本没有搞定,甚至说看了大佬的解答也没有搞定,就真的不应该写的,不过整体上的思路其实倒是想到的,和大佬们的思路如出一辙,所以还是决定写写,把我自己的理解和有问题的地方说说,然后摘录一下大佬们的code,如果有人可以理解的话,请务必在评论区解释一下,万分感谢。
这道题思路的话整体上来说就是按位进行考察,从最高位到最低位,看看在不超过k次操作的前提下可以确保哪几个位上的数字被清零。
而对应的情况,就是假设我们考察第n位,只需要考察有多少个数在第n位上为1,那么我们就至少需要n次操作才能确保留下的数当中第 n n n为0。
当然,不同的位在消除的过程当中会有重合,这个倒也不是什么大问题。
唯一的问题是,要消除这些数,如果他们不连续的情况下会引入其他的数,这样的情况下会导致另一些位上受到干扰,这个干扰的情况我一直没有想的很明白,看大佬们的代码也没有看明白他们是怎么操作的,就很不爽……
2. 代码实现
给出大佬的python代码实现如下:
class Solution:
def minOrAfterOperations(self, nums: List[int], k: int) -> int:
mask = 0
for i in range(29, -1, -1):
mask |= 1 << i
cnt = 0
carry = 0
for x in nums:
if carry != 0:
carry = carry & x & mask
cnt += 1
else:
carry = x & mask
if carry != 0:
cnt += 1
if cnt > k or cnt == len(nums):
mask ^= 1 << i
return ((1 << 30) - 1) ^ mask
又能够看明白其中carry的含义的大佬请务必在评论区指导一下,真心看晕了,万分感谢!!!