计算K置位下标对应元素的和
计算K置位下标对应元素的和
核心:判断的是下标的二进制中 1 的个数,而不是元素本身的值。
注意:
-
使用 .size() 获取 List 的长度。
-
使用 .get(index) 读取元素。
-
使用 .set(index, value) 修改元素。
-
不能对 List 使用 [] 运算符。
思路
1.遍历数组 nums 的每一个下标 i(从 0 到 nums.length-1)。
2.计算 i 的二进制表示中 1 的个数,即“置位”个数。
3.如果该个数等于 k,则将 nums[i] 累加到结果中。
4.遍历结束后返回总和
class Solution {
public int sumIndicesWithKSetBits(List<Integer> nums, int k) {
int sum = 0;
for (int i = 0; i < nums.size(); i++) {
// 如果下标 i 的二进制中 1 的个数等于 k
if (Integer.bitCount(i) == k) {
sum += nums.get(i); // 累加对应元素
}
}
return sum;
}
}
时间复杂度与空间复杂度
时间复杂度:O(n),其中 n 是数组长度。每个下标计算 Integer.bitCount 是 O(1) 操作。
空间复杂度:O(1),仅使用常量额外空间。
Integer.bitCount(i) 详细用法
作用:返回整数 i 的二进制补码表示中 1 的个数(即“置位”个数)。
力扣官方题解
class Solution {
public int sumIndicesWithKSetBits(List<Integer> nums, int k) {
int ans = 0;
for (int i = 0; i < nums.size(); ++i) {
if (bitCount(i) == k) {
ans += nums.get(i);
}
}
return ans;
}
public int bitCount(int x) {
int cnt = 0;
while (x != 0) {
cnt += (x % 2);
x /= 2;
}
return cnt;
}
}
链接:https://leetcode.cn/problems/sum-of-values-at-indices-with-k-set-bits/solutions/2614602/ji-suan-k-zhi-wei-xia-biao-dui-ying-yuan-axzr/
来源:力扣(LeetCode)
bitCount 方法(自定义的置位计数函数)
public int bitCount(int x) {
int cnt = 0;
while (x != 0) {
cnt += (x % 2); // 取最低位(0或1)
x /= 2; // 右移一位(去掉最低位)
}
return cnt;
}
这个函数用十进制转二进制的方式,通过反复取模和除法,统计 x 的二进制表示中 1 的个数:
x % 2 得到二进制最低位的值(0 或 1)
x /= 2 相当于右移一位,去掉已经检查过的最低位
循环直到 x 变为 0,累计的 cnt 就是 1 的个数
例如:
x = 5(二进制 101)
第1轮:5 % 2 = 1,cnt = 1;5 / 2 = 2
第2轮:2 % 2 = 0,cnt = 1;2 / 2 = 1
第3轮:1 % 2 = 1,cnt = 2;1 / 2 = 0
结束,返回 2
复杂度分析
时间复杂度:O(nlogn),其中 n 是数组 nums 的长度。对于每个下标,我们需要 O(logn) 的时间计算它的置位个数。
空间复杂度:O(1)。
浙公网安备 33010602011771号