题目
分析
这道题其实是要我们求第i
位二进制为1
的元素个数至少为k
,把符合条件的2^i
全部加到一起。
因此,我们的思路就是枚举数组的每一位,并且进行以下两个步骤:
- 统计所有元素第
i
位1
的个数cnt
。 - 如果
cnt >= k
,这个i
就是符合条件的,最重要被我们算到答案里面。
怎么知道第i
为是否为1
呢?
- 将第
i
位右移i
个位置到最低位。 - 然后和
1
取&
,只保留最低位,相与结果为1
代表第i
为为1
,直接相加到结果里面。
代码
class Solution {
public int findKOr(int[] nums, int k) {
int ans = 0;
// 因为 题目的提示 0 <= nums[i] < 2^31
// 所以,二进制最多有31位
for(int i = 0;i < 31;i ++) {
// 统计当前第 i 位元素的个数
int cnt = 0;
// 遍历数组每一个元素
for(int x : nums) {
// 如果当前元素第i位是1,直接累加
cnt += x >> i & 1;
}
if(cnt >= k) {
// 个数大于等于k,最终结果累加 2^i
ans += (Math.pow(2,i));
}
}
return ans;
}
}