题目描述:
对数组 nums
执行 按位与 相当于对数组 nums
中的所有整数执行 按位与 。
- 例如,对
nums = [1, 5, 3]
来说,按位与等于1 & 5 & 3 = 1
。 - 同样,对
nums = [7]
而言,按位与等于7
。
给你一个正整数数组 candidates
。计算 candidates
中的数字每种组合下 按位与 的结果。
返回按位与结果大于 0
的 最长 组合的长度。
代码思路:
- 初始化计数器数组:
- 创建一个长度为 30 的数组
cnt
,用于记录每个二进制位上 1 出现的次数。选择长度为 30 是基于假设输入整数不会超过 30 位(2^30 - 1),这样可以确保数组索引不越界。如果输入整数可能超过 30 位,则需要调整数组长度。
- 创建一个长度为 30 的数组
- 遍历候选整数:
- 对于
candidates
列表中的每一个整数x
,执行以下操作:
- 对于
- 检查每个二进制位:
- 对整数
x
,通过x.bit_length()
获取其二进制表示的长度(即最高位的索引值加 1)。然后,从最低位(索引 0)开始,到最高位,逐一检查每个二进制位。 - 使用位运算
(x >> y) & 1
来检查第y
位是否为 1。这里,x >> y
表示将x
右移y
位,& 1
用于检查最低位是否为 1。如果结果为 1,说明第y
位上是 1。
- 对整数
- 更新计数器:
- 如果发现第
y
位是 1,则将cnt[y]
加 1,表示第y
位上 1 的出现次数增加。
- 如果发现第
- 找出最大值:
- 遍历完所有候选整数后,
cnt
数组中存储了每个二进制位上 1 出现的次数。使用max(cnt)
找出这个数组中的最大值,即为某一位上 1 出现次数最多的值。
- 遍历完所有候选整数后,
- 返回结果:
- 将最大值返回作为结果。
代码实现:
class Solution:def largestCombination(self, candidates: List[int]) -> int:cnt = [0] * 30for x in candidates:for y in range(x.bit_length()):if (x >> y) & 1:cnt[y] += 1return max(cnt)