Problem#
You are given a 0-indexed integer array nums
and an integer k
.
Return _an integer that denotes thesum of elements in _nums
_whose correspondingindices have exactly _k
set bits in their binary representation.
The set bits in an integer are the 1
’s present when it is written in binary.
- For example, the binary representation of
21
is 10101
, which has 3
set bits.
Examples#
Example 1#
1
2
3
4
5
6
7
8
9
10
|
Input: nums = [5,10,1,5,2], k = 1
Output: 13
Explanation: The binary representation of the indices are:
0 = 0002
1 = 0012
2 = 0102
3 = 0112
4 = 1002
Indices 1, 2, and 4 have k = 1 set bits in their binary representation.
Hence, the answer is nums[1] + nums[2] + nums[4] = 13.
|
Example 2#
1
2
3
4
5
6
7
8
9
|
Input: nums = [4,3,2,1], k = 2
Output: 1
Explanation: The binary representation of the indices are:
0 = 002
1 = 012
2 = 102
3 = 112
Only index 3 has k = 2 set bits in its binary representation.
Hence, the answer is nums[3] = 1.
|
Constraints#
1 <= nums.length <= 1000
1 <= nums[i] <= 10^5
0 <= k <= 10
Solution#
Approach#
For each index, count the number of set bits in its binary representation. If it equals k
, add nums[i]
to the answer.
Code#
C++#
1
2
3
4
5
6
7
8
9
10
|
class Solution {
public:
int sumIndicesWithKSetBits(vector<int>& nums, int k) {
int ans = 0;
for (int i = 0; i < nums.size(); ++i) {
if (__builtin_popcount(i) == k) ans += nums[i];
}
return ans;
}
};
|
Java#
1
2
3
4
5
6
7
8
9
|
class Solution {
public int sumIndicesWithKSetBits(int[] nums, int k) {
int ans = 0;
for (int i = 0; i < nums.length; ++i) {
if (Integer.bitCount(i) == k) ans += nums[i];
}
return ans;
}
}
|
Kotlin#
1
2
3
4
5
6
7
8
9
|
class Solution {
fun sumIndicesWithKSetBits(nums: IntArray, k: Int): Int {
var ans = 0
for (i in nums.indices) {
if (i.countOneBits() == k) ans += nums[i]
}
return ans
}
}
|
Python#
1
2
3
|
class Solution:
def sumIndicesWithKSetBits(self, nums: list[int], k: int) -> int:
return sum(x for i, x in enumerate(nums) if bin(i).count('1') == k)
|
Rust#
1
2
3
4
5
|
impl Solution {
pub fn sum_indices_with_k_set_bits(nums: Vec<i32>, k: i32) -> i32 {
nums.into_iter().enumerate().filter(|(i,_)| i.count_ones() == k as u32).map(|(_,x)| x).sum()
}
}
|
TypeScript#
1
2
3
4
5
6
7
|
function sumIndicesWithKSetBits(nums: number[], k: number): number {
let ans = 0;
for (let i = 0; i < nums.length; ++i) {
if (i.toString(2).split('1').length - 1 === k) ans += nums[i];
}
return ans;
}
|
Explanation#
We check the number of set bits for each index and sum the values at those indices where the count matches k
.
Complexity#
- ⏰ Time complexity:
O(n log n)
- 🧺 Space complexity:
O(1)