《剑指 Offer》专项突破版 - 面试题 3 :前 n 个数字二进制形式中 1 的个数(C++ 实现)

news2024/12/24 3:37:59

目录

前言

方法一

方法二 

方法三 


 


前言

题目链接:338. 比特位计数 - 力扣(LeetCode)

题目

输入一个非负数 n,请计算 0 到 n 之间每个数字的二进制形式中 1 的个数,并输出一个数组。例如,输入的 n 为 4,由于 0、1、2、3、4 的二进制形式中 1 的个数分别为 0、1、1、2、1,因此输出数组 [0, 1, 1, 2, 1]。

分析

很多人在面试的时候都能想到直观的解法,使用一个 for 循环来计算从 0 到 n 的每个整数 i 的二进制形式中 1 的个数。于是问题转换成如何求一个整数 i 的二进制形式中 1 的个数


方法一

计算整数 i 的二进制形式中 1 的个数有多种不同的方法,其中一种比较高效的方法是每次使用 i = i & (i - 1); 将整数 i 的最右边的 1 变成 0

整数 i 减去 1,那么它最右边的 1 变成 0,如果它的右边还有 0,则右边所有的 0 都变成 1,而其左边所有位都保存不变。因此,i = i & (i - 1); 相当于将整数 i 的最右边的 1 变成 0

class Solution {
public:
    vector<int> countBits(int n) {
        vector<int> result(n + 1, 0);
        for (int i = 0; i <= n; ++i)
        {
            int tmp = i;
            while (tmp != 0)
            {
                ++result[i];
                tmp = tmp & (tmp - 1);
            }
        }
        return result;
    }
};

如果一个整数共有 k 位,那么它的二进制形式中可能有 O(k) 个 1。在上述代码中,while 循环中的代码对每个整数将执行 O(k) 次,因此,上述代码的时间复杂度是 O(nk)。


方法二 

根据前面的分析可知,i = i & (i - 1); 将 i 的二进制形式中最右边的 1 变成 0,也就是说,整数 i 的二进制形式中 1 的个数比整数 i & (i - 1) 的二进制中 1 的个数多 1

class Solution {
public:
    vector<int> countBits(int n) {
        vector<int> result(n + 1, 0);
        for (int i = 1; i <= n; ++i)  // 注意:i 从 1 开始
        {
            result[i] = result[i & (i - 1)] + 1;
        }
        return result;
    }
};

不管整数 i 的二进制形式中有多少个 1,上述代码只根据 O(1) 的时间就能得出整数 i 的二进制形式中 1 的数目,因此时间复杂度位 O(n)


方法三 

还可以使用另一种思路来解决这个问题。

如果正整数 i 是一个偶数,即最低位为 0,那么 i 的二进制形式中 1 的个数和 "i >> 1" 是相同的

如果正整数 i 是一个奇数,即最低位为 1,那么 i 的二进制形式中 1 的个数比 "i >> 1" 多 1

class Solution {
public:
    vector<int> countBits(int n) {
        vector<int> result(n + 1, 0);
        for (int i = 1; i <= n; ++i)  // 注意:i 从 1 开始
        {
            result[i] = result[i >> 1] + (i & 1);
        }
        return result;
    }
};

上述代码用 "i & 1" 计算 "i % 2",这是因为位运算比求余运算更高效

这种解法的时间复杂度也是 O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1361302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【python爬虫开发实战 情感分析】利用爬虫爬取城市评论并对其进行情感分析

&#x1f680;个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; &#x1f4a1;专栏&#xff1a; python网络爬虫从基础到实战 带你学习爬虫从基础到实战 深度学习带你感受AI的魅力 &#x1f4a1;往期推荐&#xff1a; ⭐️前面比较重要的基础内容&#xff1a; 【Py…

日常测试工作中哪些是必须知道的 SQL 语句?

SQL 简介 SQL(Structured Query Language&#xff0c;结构化查询语言)是一套用于管理关系数据库管理系统(RDBMS)&#xff0c;基于 ANSI&#xff08;American National Standards Institute 美国国家标准化组织&#xff09;标准的计算机语言&#xff0c;比较重要的版本是 SQL92…

2023 最火的是什么? 超维计算 + 神经网络

从chatgpt开始&#xff0c;人工智能进步的步伐似乎势不可挡&#xff0c;但支撑这些程序的人工神经网络遇到了一些重大限制&#xff0c;其他的很难推理但是人类的大脑能够通过类比进行推理&#xff0c;当我们看到新事物时&#xff0c;我们不必生长新的神经元&#xff0c;我们可以…

飞凌全志T113-i开发板视频编码测试

前言 本文测试OK113i-S开发板-视频编解码的功能 OK113i-S开发板是支持视频的编解码的&#xff0c;下面是官方介绍的编解码功能 T113-i 是一种为多媒体解码平台设计的高级应用处理器。T113-i 集成了64位玄铁C906 RISC-V CPU&#xff0c; 双核 Cortex - A7 CPU 和 HiFi4 DSP&a…

Java反射篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、反射使用步骤(获取 Class 对象、调用对象方法)二、获取 Class 对象有几种方法三、利用反射动态创建对象实例前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章…

所有单片机使用的汇编语言是统一的吗?

所有单片机使用的汇编语言是统一的吗&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&…

跑通大模型领域的 hello world

跑通书生浦语大模型的 3 个趣味 demo&#xff08;InternLM-Chat-7B 智能对话、Lagent工具调用解简单数学题、浦语灵笔多模态图文创作和理解&#xff09;视频和文档。 1、两个框架 InternLM 是⼀个开源的轻量级训练框架&#xff0c;旨在⽀持⼤模型训练⽽⽆需⼤量的依赖。 Lage…

TSINGSEE青犀智能分析网关V4在智慧园区车辆违停检测场景中的应用

一、背景与需求 园区作为企业办公、生产制造的重要场所&#xff0c;主要道路车辆违停等违规行为会对园区的安全造成隐患&#xff0c;并且在上下班高峰期内&#xff0c;由于发现不及时&#xff0c;车辆违停行为会造成出入口拥堵现象&#xff0c;这也成为园区管理的棘手问题。为了…

提升软件质量与效率:UI自动化测试的重要性

在软件开发领域&#xff0c;UI自动化测试工具被广泛应用&#xff0c;其意义不仅仅体现在节省时间和资源上&#xff0c;更关系到软件质量的提升、团队效率的增加&#xff0c;以及用户体验的改善。本文将探讨使用UI自动化测试工具的重要性&#xff0c;以及它在软件开发生命周期中…

JVM知识总结(简单且高效)

1. JVM内存与本地内存 JVM内存&#xff1a;受虚拟机内存大小的参数控制&#xff0c;当大小超过参数设置的大小时会报OOM。本地内存&#xff1a;本地内存不受虚拟机内存参数的限制&#xff0c;只受物理内存容量的限制&#xff1b;虽然不受参数的限制&#xff0c;如果所占内存超过…

C语言学习NO.13-字符函数(三)-strncpy,strncat,strncmp长度受限制的字符串函数

长度受限制的字符串函数介绍 一、strncpy函数的使用 &#xff08;一&#xff09;strncpy使用 #include <stdio.h> #include <string.h>int main() {char arr1[20] "asdfgdfv";char arr2[7] "zxcvbn";strncpy(arr1, arr2, 4);printf("…

Origin无法使用主题管理器相关功能或报错:Err, Save Theme dialog error!

问题描述 在使用origin绘图时&#xff0c;往往需要进行大批量绘制同样类型的图。如果每个图都不断地去修改相关设置&#xff0c;无疑是浪费了许多宝贵的时间。为了提高绘图效率&#xff0c;了解到了主题管理器&#xff0c;可在“工具–主题管理器”找到。 然而&#xff0c;当我…

计算机毕业设计-----SSM宠物商城带后台管理系统

项目介绍 该项目为前后台项目&#xff0c;分为普通用户与管理员两种角色&#xff0c;前台普通用户登录&#xff0c;后台管理员登录&#xff1b; 用户角色包含以下功能&#xff1a; 加入购物车,发表留言,提交订单,查看订单信息,会员注册,登录页面等功能。 管理员角色包含以下…

静态网页设计——极乐迪斯科(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV11k4y1X7mH/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS&#xff08;…

C++补充内容--EasyX-UI界面

esay x 其他 地图打印(利用二维数组) 双缓冲 当我们绘制一张图 然后另一张图盖住前一张图的某个部分的时候 由于while的存在 会导致 两张图不停的闪烁 所以加入双缓冲可以解决这个问题 开启双缓冲 之后等待Flush或者End 才会进行图片的绘制 不然不会进行图片的绘制,这样就可…

Python学习之路——文件部分【文件的读取】

目录 先解释一下引文的答案 一、open()打开函数 二、mode常用的三种基础访问模式 三、读-操作相关方法 &#xff08;一&#xff09;read方法 &#xff08;二&#xff09;readlines方法 &#xff08;三&#xff09;with open 语法 &#xff08;四&#xff09;操作汇总 …

腾讯云2核2G3M服务器够用吗?腾讯云2核2G3M云服务器性能评测

阿里云轻量应用服务器2核2G3M带宽优惠价格62元一年&#xff0c;100%CPU性能&#xff0c;3M带宽下载速度384KB/秒&#xff0c;40GB SSD系统盘&#xff0c;月流量200GB&#xff0c;折合每天6.6GB流量&#xff0c;超出月流量包的流量按照0.8元每GB的价格支付流量费&#xff0c;地域…

【c++】vector模拟

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;能手撕vector模拟 > 毒鸡汤&#xff1a;在等待…

PCL提示无法读取强度信息(Failed to find match for field ‘intensity‘.)简单解决方法

问题&#xff1a; 使用CC或者其他软件将las或者其他格式点云转成PCD格式后&#xff0c;然后使用PCL的库进行读取&#xff0c;有时会碰到Failed to find match for field intensity.提示&#xff0c;解决方法如下&#xff1b; 处理方法&#xff1a; 一个比较简单的方法如下&…

对比开源大语言模型的自然语言生成SQL能力

背景 NL-to-SQL&#xff08;自然语言到结构化查询语言&#xff09;任务是自然语言处理&#xff08;NLP&#xff09;领域的一个难题。 它涉及将自然语言问题转换为 SQL 查询&#xff0c;然后可以针对关系数据库执行该查询来回答问题。 该任务是 NLP 中的一个专门子领域&#xf…