【力扣每日一题】力扣2859计算k位置下标对应元素的和(bitCount源码分析及实现)

这篇具有很好参考价值的文章主要介绍了【力扣每日一题】力扣2859计算k位置下标对应元素的和(bitCount源码分析及实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目来源

力扣2859计算k位置下标对应元素的和

题目概述

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

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

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

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

思路分析

大部分语言都内置了bitCount函数,最简单的方法就是调用库函数了。

bitCount函数分析

这里以java源码为例分析bitCount函数,Java的Integer和Long类中都提供了bitCount。 其实是非常好理解的

public static int bitCount(int i) {
    // HD, Figure 5-2
	// 这里是代码的关键,计算出每两位中1的个数
    i = i - ((i >>> 1) & 0x55555555);
	// 以下开始执行每两位相加、每四位相加,最终得到结果
    i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
    i = (i + (i >>> 4)) & 0x0f0f0f0f;
    i = i + (i >>> 8);
    i = i + (i >>> 16);
    return i & 0x3f;
}

为了使解析工整 我做成了图片: 

【力扣每日一题】力扣2859计算k位置下标对应元素的和(bitCount源码分析及实现),leetcode,java,算法,c++

自己使用C++实现一个bit_count

java源码中难想到的点在于0bAB - 0b0A的结果会是0xAB中权值为1的位的数量。

其实我们还有一种更容易想到的思路:

  1. 我们可以把0bAB拆分为0b0A0b0B 这样两个数只可能是0或者1;
  2. 拆分开的1和0本身就代表了这两个数中1的数量,直接相加就可以得到结果;
  3. 最后可以通过每两位相加得到结果。

GCC编译器内置了__builtin_popcount函数可以实现数位计数,我这里只有Visual Studio 2019,MSVC好像没有提供这个函数,所以我决定自己来实现一下这个函数。

class Solution {
public:
    int sumIndicesWithKSetBits(vector<int>& nums, int k) {
        int result = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (bit_count(i) == k) {
                result += nums[i];
            }
        }
        return result;
    }

    int bit_count(int data) {
        // 0b0A + 0b0B 可以得到两位的个数
        data = (data & 0x55555555) + ((data >> 1) & 0x55555555);
        int result = 0;
        while (data > 0) {
            result += data & 0x03;
            data >>= 2;
        }
        return result;
    }
};

c++结果

也能实现,就是内存使用有点惨不忍睹。。。。。 

【力扣每日一题】力扣2859计算k位置下标对应元素的和(bitCount源码分析及实现),leetcode,java,算法,c++文章来源地址https://www.toymoban.com/news/detail-823869.html

到了这里,关于【力扣每日一题】力扣2859计算k位置下标对应元素的和(bitCount源码分析及实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【力扣每日一题04】数组篇--搜索插入位置

    今天的题目,利用的是二分查找原理。很不幸我又没做出来,但是也很高兴发现自己的不足~ 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 示例 1: 示例 2: 示例 3: 由于官方答案我看不明

    2024年02月09日
    浏览(42)
  • 力扣每日一题82:删除排序链表中的重复元素||

    给定一个已排序的链表的头  head  ,  删除原始链表中所有重复数字的节点,只留下不同的数字  。返回  已排序的链表  。 示例 1: 示例 2: 提示: 链表中节点数目在范围  [0, 300]  内 -100 = Node.val = 100 题目数据保证链表已经按升序  排列 通过次数 370.5K 提交次数 691.1K 通

    2024年02月08日
    浏览(40)
  • 【力扣每日一题】1572. 矩阵对角线元素的和 & 8.11打卡

    1572. 矩阵对角线元素的和 难度: 简单 描述: 给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 返回合并后的二叉树。 注意: 合并过程必须从两个树的根节点开始。 示例 1: 输入:mat = [

    2024年02月12日
    浏览(36)
  • 计算两个二维数组arr1和arr2中对应位置元素的商

    代码实现 :一个嵌套循环,用于计算两个二维数组arr1和arr2中对应位置元素的商,并将结果存储在result数组中。首先,定义了一个空数组result用于存储结果。然后,通过两个for循环遍历arr1数组的每一行和每一列。在内层循环中,通过arr1[i][j]和arr2[i][j]分别获取arr1和arr2中对应

    2024年02月12日
    浏览(35)
  • 【C语言】每日一题(寻找数组的中心下标)

    寻找数组的中心下标,链接奉上 ​​​​​​​思路: 依旧是我们的老朋友,暴力循环。 1.可以利用外层for循环,循环变量为数组下标,在循环内分别求出下标左边与右边的sum 2.在边界时讨论, 当下标为左边界(nums[0])时,left sum=0;当下标为右边界(nums[numsSize-1)时,r

    2024年02月13日
    浏览(48)
  • 每日一题——两数之和(返回下标和返回数值两种情况)

    题目链接 思路 注:本题只采用暴力解法,时间复杂度为O(n 2 ),如果采用哈希表,可以将时间复杂度降到O(n),但由于笔者还未对哈希表展开学习,故不做讨论 我们直接用两层for循环来解决问题 第一层for循环用来遍历整个数组,第二层for循环用来判断遍历的两个数的和是否等

    2024年02月07日
    浏览(41)
  • 【力扣每日一题】力扣2765最长交替子数组

    力扣2765最长交替子数组 给你一个下标从 0 开始的整数数组 nums 。如果 nums 中长度为 m 的子数组 s 满足以下条件,我们称它是一个 交替子数组 : m  大于  1  。  s1  =  s0  +  1  。 下标从  0  开始的子数组  s  与数组 [ s0 ,  s1 ,  s0 ,  s1 ,..., s(m-1) % 2 ] 一样。也就是说,

    2024年01月24日
    浏览(51)
  • 力扣每日一题90:子集

    给你一个整数数组  nums  ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。 解集  不能  包含重复的子集。返回的解集中,子集可以按  任意顺序  排列。 示例 1: 示例 2: 提示: 1 = nums.length = 10 -10 = nums[i] = 10 通过次数 330.7K 提交次数 520.9K 通过率 63

    2024年02月06日
    浏览(29)
  • 2023-08-23力扣每日一题

    链接: 1782. 统计点对的数目 题意: 给n个点和m条无向边(可重复),q个查询 定义 edge[a] 为一个点是a的边数量,定义 ret[a,b] 是 edge[a]+edge[b]-(a与b的边) q个查询q个答案,第i次查询值 val[i] ,求所有的 1=ab=n 条件下有多少 ret[a,b]val[i] 解: TLE卡47了 看了评论区用空间换时间,

    2024年02月10日
    浏览(59)
  • 2023-08-18力扣每日一题

    链接: 1388. 3n 块披萨 题意: 一个长度3n的环,选n次数字,每次选完以后相邻的数字会消失,求选取结果最大值 解: 这波是~~(ctrl)CV工程师了~~ 核心思想是选取 n个不相邻 的元素一定 合法 ,我推不出来,猜一猜倒是可以O.o DP[i][j] 表示从 [0,i] 中选取 j 个数字的最大值 初始

    2024年02月12日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包