首页 > 其他分享 >100031. 计算 K 置位下标对应元素的和-363

100031. 计算 K 置位下标对应元素的和-363

时间:2023-09-17 19:47:39浏览次数:76  
标签:置位 二进制 nums int 363 100031 table 256 0xf

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

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

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

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

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

示例 1:

输入:nums = [5,10,1,5,2], k = 1
输出:13
解释:下标的二进制表示是:
0 = 0002
1 = 0012
2 = 0102
3 = 0112
4 = 1002
下标 1、2 和 4 在其二进制表示中都存在 k = 1 个置位。
因此,答案为 nums[1] + nums[2] + nums[4] = 13 。
示例 2:

输入:nums = [4,3,2,1], k = 2
输出:1
解释:下标的二进制表示是:
0 = 002
1 = 012
2 = 102
3 = 112
只有下标 3 的二进制表示中存在 k = 2 个置位。
因此,答案为 nums[3] = 1 。

提示:

\[1 <= nums.length <= 1000\\ 1 <= nums[i] <= 10^5\\ 0 <= k <= 10\\ \]

解题思路

判断每个下标的二进制位的数目是否等于K。其中最重要的是统计32位整数的二进制位的1的数目,可以遍历统计,不过是可以在O(1)的时间内实现查询32整数的,使用的c++的内置函数:__builtin_popcount(num).
内部实现:

  1. 将32位整数划分为四个byte
  2. 每个byte有256个数:00000000 -> 11111111
  3. 可以预先打表记录256个数的二进制位的1的个数
  4. 然后通过四次查询得到最后的结果

以下是四位一组的打表实现:

class Solution {
public:
    //O(1)时间内实现查询
    //打表查询
    //8位一组,一个有256个数,查询四次即可
    //256个打表有一点多
    //先写一个4位打表的吧

    int hammingWeight(uint32_t n) {

       int table[16] = {0,1,1,2,1,2,2,3,
                        1,2,2,3,2,3,3,4};

        
        return table[n & 0xf] + table[(n >> 4) & 0xf] + table[(n >> 8) & 0xf] + table[(n >> 12) & 0xf] + table[(n >> 16) & 0xf] + table[(n >> 20) & 0xf] + table[(n >> 24) & 0xf] + table[(n >> 28) & 0xf];
    }
};

code

class Solution {
public:
    //如何在O(1)的时间内统计二进制位1的数目
    //c++ : __builtin_popcount(num)
    //内部实现:查表法
    //32位的int实际上有4byte
    //一个byte有八位也就是表示00000000 -> 11111111一共256个数
    //可以预处理出256个数的1的个数
    //然后进行四次查表即可
    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;
    }
};

标签:置位,二进制,nums,int,363,100031,table,256,0xf
From: https://www.cnblogs.com/huangxk23/p/17709574.html

相关文章

  • 实用指令_大数据shell_变量_设置位置参数
    位置参数当我们执行一个shell脚本时,如果希望获取命令行的参数信息,就可以使用位置参数变量比如:/myshell.sh100200,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息基本语法$n(功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,需......
  • B3635 硬币问题
    B3635硬币问题方法一:搜索#include<bits/stdc++.h>usingnamespacestd;intm;intdfs(intn){//求凑够n元的最小硬币数 if(n<=4&&n>=1)returnn; if(n>=5&&n<=9)returnn-4; if(n>=10&&n<=11)return12-n; ret......
  • 【LuoGu 1363】幻象迷宫——深度优先搜索 + 读题
    幻象迷宫题目背景(喵星人LHX和WD同心协力击退了汪星人的入侵,不幸的是,汪星人撤退之前给它们制造了一片幻象迷宫。)WD:呜呜,肿么办啊……LHX:momo...我们一定能走出去的!WD:嗯,+U+U!题目描述幻象迷宫可以认为是无限大的,不过它由若干个\(N\timesM\)的矩阵重复组成。矩阵中有的地......
  • uvalive 3363(区间dp)
    题意:给出一个字符串,问最多能缩减到多短。缩减方式比如:aaaaabbbb->5(a)4(b)nowletsgogogoletsgogogo->now2(lets3(go))题解:区间dp,f[l][r]表示从l到r最多缩减到的长度。#include<stdio.h>#include<string.h>#include<algorithm>usingnamespacestd;constintN=2......
  • 福昕Foxit PDF远程代码执行漏洞CVE-2023-27363分析与复现
    漏洞概述福建福昕软件开发股份有限公司是一家国际化运营的PDF电子文档解决方案提供厂商,提供文档的生成、转换、显示、编辑、搜索、打印、存储、签章、表单、保护、安全分发管理等涵盖文档生命周期的产品技术与解决方案。其下产品FoxitPDFReader和FoxitPDFEditor的javascript函......
  • 换个思路,简单很多——B3637 最长上升子序列
    题面:B3637最长上升子序列-洛谷|计算机科学教育新生态(luogu.com.cn)  可恶,搞了半天结果是很简单的一个题目  我一直在想目标序列的左右对称  即序列中每一个负数块的和都小于左右两侧任一部分的和后来看了几个题解,发现只要从一个方向扫一遍,就必定扫到最优解  将和......
  • Qt编写onvif工具(搜索/云台/预置位/OSD/录像存储)
    一、前言从最初编写这个工具开始的时间算起来,至少5年多,一直持续完善到今天,这个工具看起来小也不小大也不大,但是也是经历过无数个现场的洗礼,毫不夸张的说,市面上能够遇到的主流的厂商的设备,都测试过,而且做过大量设备的测试,并不是调试个一个两个的,也并不是在实验室环境中搞开发的,而......
  • 【每日一题】Problem 363B. Fence
    原题解决思路求k个木板的最小高度和,因为所有木板的高度和不超过1e9,因此计算出到当前木板j的总高度-前j-k模板的总高度并求得最小数即可#include<bits/stdc++.h>intmain(){intn,k;std::cin>>n>>k;std::vector<int>vec(n+1,0);for(in......
  • Ubuntu开始菜单中的程序图标放置位置
    可能放置在以下两个位置中的一个/usr/share/applications~/.local/share/applications.desktop文件的内容#!/usr/bin/envxdg-open[DesktopEntry]Version=1.0Terminal=falseType=ApplicationName=MicrosoftTeamsExec=/opt/microsoft/msedge/microsoft-edge--profile......
  • 西门康IGBT模块存在sql注入 QTVA-2023-3632489
    网址:http://www.gl-igbt.com/product.php?id=6 漏洞描述: 西门康igbt模块,采购平台,便捷购买,专业代理,售后无忧,大量现货供应,模块齐全,可直接供货,一键下单,整流桥功率,西门康一站式采购平台,可长期稳定供货 西门康IGBT模块存在sql注入漏洞,攻击者可利用该漏洞获取数据库......