当前位置: 首页 > news >正文

【Python3】【力扣题】338. 比特位计数

【力扣题】题目描述:

题解:从0到n的整数,逐一统计二进制中1的个数,记录在一个新列表中。

【Python3】代码:

1、解题思路:Python函数。

知识点:bin(...):转为二进制字符串,即"0bxxx"。

              字符串.count(...):统计字符串中某字符出现的次数。

              列表.append(...):往列表尾部添加元素。

              列表推导式:用简洁的方式创建列表。即 [ 对元素的简单操作 for 变量 in 可迭代对象 ]

class Solution:def countBits(self, n: int) -> List[int]:res = [bin(i)[2:].count("1") for i in range(n+1)]return res#相当于res = []for i in range(n+1):res.append(bin(i)[2:].count("1"))return res

2、解题思路:Brian Kernighan算法。

每次将整数的二进制最低位的1消除为0,直到整数变为0。消除多少次则二进制中有多少个1。

num &= (num-1) 即 num = num & (num-1) 。

相当于将二进制最低位的1消除为0。若num为2的整数幂,则num&(num-1)=0。

例如:num=5(二进制101),num-1=4(二进制100),num&(num-1)=101&100=100(即将101的最低位的1消除为0)。

class Solution:def countBits(self, n: int) -> List[int]:res = []for i in range(n+1):cou = 0while i > 0:i &= (i-1)cou += 1res.append(cou)return res# 或者def count_one(num):cou = 0while num > 0:num &= (num-1)cou += 1return cou  res = [count_one(i) for i in range(n+1)]return res

3、解题思路:动态规划。

将一个问题拆分成多个子问题,解决子问题并记录子问题的结果减少重复计算,最终整个问题解决。

(3-1)若num是2的整数幂,num中只有最高位有1,则记录num。

若num不是2的整数幂,则num的二进制 比 去除最高位之后的二进制 多一个1。

例如:5(二进制101),去除最高位之后的二进制01(其个数已统计过为1),则5的二进制中1的个数为1+1=2个。

class Solution:def countBits(self, n: int) -> List[int]:# 动态规划--最高有效位res = [0]high = 0                    # 记录最高有效位即二进制中只有最高位有一个1for i in range(1,n+1):if i & (i-1) == 0:high = ires.append(res[i-high] + 1)return res

(3-2)将二进制右移一位,去除最低位之后的二进制中1的个数已统计过;被去除的最低位若为1则结果中再加1。

例如:5(二进制101),右移一位之后的二进制10(其个数已统计过为1),被去除的最低位为1则5的二进制中1的个数为1+1=2个。

知识点:num >> 1:将num二进制右移一位。

              i & 1:将num与1进行二进制与运算。

class Solution:def countBits(self, n: int) -> List[int]:# 动态规划-最低有效位res = [0]for i in range(1,n+1):res.append(res[i >> 1] + (i & 1))return res

(3-3)num&(num-1)消除num最低位的1,则num 比 消除最低位1之后 多一个1。

例如:num=5(二进制101),num-1=4(二进制100),num&(num-1)=101&100=100,二进制100其个数已统计过为1,则5的二进制中1的个数为1+1=2个。

class Solution:def countBits(self, n: int) -> List[int]:# 动态规划--最低设置位res = [0]for i in range(1,n+1):res.append(res[i & (i-1)] + 1)return res

相关文章:

  • 设备健康管理平台助力锂电企业实现可持续发展
  • 小程序开通电子发票
  • 手把手教你编写LoadRunner脚本
  • 『亚马逊云科技产品测评』活动征文|AWS 数据库产品类别及其适用场景详细说明
  • 【数据结构初阶】栈和队列
  • 机器学习实战-第5章 Logistic回归
  • uniapp开发小程序-如何判断小程序是在手机端还是pc端打开
  • C++纯虚函数和抽象类 制作饮品案例(涉及知识点:继承,多态,实例化继承抽象类的子类,多文件实现项目)
  • Vue3简单使用(一) --- 环境搭建
  • Autox.js和Auto.js4.1.1手机编辑器不好用我自己写了一个编辑器
  • B032-服务器 Tomcat JavaWeb项目 Servlet
  • python二叉树遍历_先序中序后序_深度优先广度优先_非递归先序非递归中序
  • C语言——从键盘输人三角形的三个边长 a、b、c,求出三角形的面积。
  • 【OpenCV实现图像:制作酷炫的动画效果】
  • css实现原生form表单label必填选项红色*样式,以及js控制必填校验
  • python3.6+scrapy+mysql 爬虫实战
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 《深入 React 技术栈》
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 5、React组件事件详解
  • Android Studio:GIT提交项目到远程仓库
  • C++类的相互关联
  • canvas 高仿 Apple Watch 表盘
  • CentOS 7 防火墙操作
  • CSS实用技巧
  • git 常用命令
  • gulp 教程
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • leetcode388. Longest Absolute File Path
  • Markdown 语法简单说明
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Spark学习笔记之相关记录
  • Spring Cloud Feign的两种使用姿势
  • 对话:中国为什么有前途/ 写给中国的经济学
  • - 概述 - 《设计模式(极简c++版)》
  • 工程优化暨babel升级小记
  • 记录一下第一次使用npm
  • 前端之React实战:创建跨平台的项目架构
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 深入浅出Node.js
  • 思否第一天
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 微服务入门【系列视频课程】
  • 我感觉这是史上最牛的防sql注入方法类
  • 一个完整Java Web项目背后的密码
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 《码出高效》学习笔记与书中错误记录
  • ​ubuntu下安装kvm虚拟机
  • ​如何防止网络攻击?
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #NOIP 2014#Day.2 T3 解方程
  • #stm32驱动外设模块总结w5500模块
  • (0)Nginx 功能特性
  • (3)llvm ir转换过程
  • (4)事件处理——(7)简单事件(Simple events)