• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

youyou-dev

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

计算K置位下标对应元素的和

计算K置位下标对应元素的和

目录
  • 计算K置位下标对应元素的和
    • 思路
    • 时间复杂度与空间复杂度
    • Integer.bitCount(i) 详细用法
    • 力扣官方题解

image

核心:判断的是下标的二进制中 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)。

posted on 2026-03-30 21:40  U~U  阅读(1)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3