题目
分析
这道题的题意很明确。就是求每一个下标的二进制中1的个数为k的下标所对应的元素值之和。
Java 中有 库函数 Integer.bitCount(num)
,这个函数的返回值就是 num 中 1 的个数。
代码
class Solution {
public int sumIndicesWithKSetBits(List<Integer> nums, int k) {
int ans = 0;
for(int i = 0;i < nums.size();i ++) {
if(Integer.bitCount(i) == k) {
ans += nums.get(i);
}
}
return ans;
}
}
扩展
万一人家不让用库函数怎么办呢?????
那我们就需要老老实实自己写函数了。
我们首先考虑,怎么求得一个数字num 包含 1 的个数。
我们都知道 1 & 任何数 都得任何数。
那么我们就可以让 1&这个数的每一位 如果等于1就代表最后一位是1,然后右移这个数字,判断num二进制数的倒数第二位是否是1,依次判断,直到这个数字被移动为 0 为止。
下面看一下这段的代码:
int find(int num) {
int count = 0;
while(num != 0) {
if((num & 1) == 1) count++;
num >>= 1;
}
return count;
}
根据上面的函数find我们就知道了一个数字二进制中 1 的个数了,接下来就可以解决 leetCode上面的题目了:
class Solution {
public int sumIndicesWithKSetBits(List<Integer> nums, int k) {
int ans = 0;
for(int i = 0;i < nums.size();i ++) {
if(find(i) == k) {
ans += nums.get(i);
}
}
return ans;
}
int find(int num) {
int count = 0;
while(num != 0) {
if((num & 1) == 1) count++;
num >>= 1;
}
return count;
}
}