【Py/Java/C++三种语言详解】LeetCode每日一题240125【位运算】LeetCode2859、计算K置位下标对应元素的和

题目链接

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

题目描述

给你一个下标从 0 开始的整数数组 nums 和一个整数 k

请你用整数形式返回 nums 中的特定元素之 ,这些特定元素满足:其对应下标的二进制表示中恰存在 k 个置位。

整数的二进制表示中的 1 就是这个整数的 置位

例如,21 的二进制表示为 10101 ,其中有 3 个置位。

示例 1

输入:nums = [5,10,1,5,2], k = 1
输出:13
解释:下标的二进制表示是: 0 = 000(2) 1 = 001(2) 2 = 010(2) 3 = 011(2) 4 = 100(2)

下标 1、2 和 4 在其二进制表示中都存在 k = 1 个置位。 因此,答案为 nums[1] + nums[2] + nums[4] = 13 。

示例 2

输入:nums = [4,3,2,1], k = 2
输出:1
解释:下标的二进制表示是: 0 = 00(2) 1 = 01(2) 2 = 10(2) 3 = 11(2)

只有下标 3 的二进制表示中存在 k = 2 个置位。 因此,答案为 nums[3] = 1 。

提示

  • 1 <= nums.length <= 1000
  • 1 <= nums[i] <= 10(5)
  • 0 <= k <= 10

解题思路

属于理解了题意就能够直接做出来的题目,子问题需要判断数字i的二进制表示一共包含多少个1,既可以自定义check()函数,也可以直接调用API即bit_count()来解决该子问题。最后把nums中所有满足下标i的二进制表示中的1的个数等于k的元素nums[i]加起来,即为答案。

代码

Python

class Solution:
    # 辅助函数check(),用于计算数字i是否是k置位
    def check(self, i, k):
        while i:
            # 当i的最后一位是1,存在1个置位
            # 也可以使用 i & 1 == 1 来判断
            if i % 2 == 1:
                k -= 1
            # i右移,将二进制的末位删除
            i >>= 1
        # 若最后k降为0,说明i包含k置位
        return k == 0

    def sumIndicesWithKSetBits(self, nums: List[int], k: int) -> int:
        # check()也可以直接使用API来代替
        # 将self.check(i, k)用 i.bit_count() == k来代替
        # 把nums中所有满足下标i的二进制中的1的个数等于k的元素nums[i]加起来即为答案
        return sum(num for i, num in enumerate(nums) if self.check(i, k))

Java

class Solution {
    // Helper function check(), used to check if the number i has k set bits
    private boolean check(int i, int k) {
        while (i != 0) {
            if ((i & 1) == 1) {
                k--;
            }
            i >>= 1;
        }
        // If k becomes 0, it means i contains k set bits
        return k == 0;
    }

    public int sumIndicesWithKSetBits(List<Integer> nums, int k) {
        int ans = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (check(i, k)) {
                ans += nums.get(i);
            }
        }
        return ans;
    }
}

C++

class Solution {
public:
    // Helper function check(), used to check if the number i has k set bits
    bool check(int i, int k) {
        while (i != 0) {
            if (i & 1) {
                k--;
            }
            i >>= 1;
        }
        // If k becomes 0, it means i contains k set bits
        return k == 0;
    }

    int sumIndicesWithKSetBits(std::vector<int>& nums, int k) {
        int ans = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (check(i, k)) {
                ans += nums[i];
            }
        }
        return ans;
    }
};

时空复杂度

时间复杂度:O(NlogN)

空间复杂度:O(1)


华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值