题目
2917. 找出数组中的 K-or 值
分析
这道题其实是要我们求第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^ians += (Math.pow(2,i));}}return ans;}
}