力扣/leetcode383.比特位记数

devtools/2024/9/24 8:43:12/

题目描述

给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。

示例

代码思路

第一种方法

最简单的方法就是,遍历然后使用python自带的bin()方法直接转换为2进制然后用count去数数。

第二种方法

考虑到数的特点,如果该数i为偶数,那么他二进制中1的个数和他i/2的数的1的个数是一样的

那是因为偶数的末尾是0,向右边移动一位,然后就变成i/2,这导致1的数量不变

如果i为奇数,那么它的二进制1的位数=i-1的二进制位数+1

1:奇数二进制末尾为1如果把末尾的1去掉就相当于在原有基础上减1

2:减掉1后,奇数就变成偶数了,而偶数的二进制数又是总和它i/2是相等的,这就进入了递归的环节了。

python">class Solution(object):def countBits(self, num):res = []for i in range(num + 1):res.append(self.count(i))return resdef count(self, num):if num == 0:return 0if num % 2 == 1:return self.count(num - 1) + 1return self.count(num // 2)

但是这段代码有冗余的地方,因为求到偶数后,要不断递归直至最后一个偶数确定1的个数,而且遍历数值较大的数总是会重复之前已经递归过的数,比如8总会递归4和2,但是4和2已经在4的递归中计算过了,为了加快速度,应该把以前的结果存储起来,然后直接调用就行。

第二种方法的改进

python">class Solution(object):def countBits(self, num):self.memo = [0] * (num + 1)res = []for i in range(num + 1):res.append(self.count(i))return resdef count(self, num):if num == 0:return 0if self.memo[num] != 0:return self.memo[num]if num % 2 == 1:res = self.count(num - 1) + 1else:res = self.count(num // 2)self.memo[num] = resreturn res

进入count后 判断非0后直接判断是否存在列表里,有的话直接调值。


http://www.ppmy.cn/devtools/39939.html

相关文章

DDoS攻防,本质上是成本博弈!

在互联网里&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击作为一种常见的网络威胁&#xff0c;持续对网站、在线服务和企业基础设施构成严重挑战。本文旨在探讨实施DDoS攻击的大致成本、以及企业如何采取有效措施来防范此类攻击&#xff0c;确保业务连续性和网络…

AI学习指南概率论篇-贝叶斯推断

AI学习指南概率论篇-贝叶斯推断 概述 在人工智能中&#xff0c;贝叶斯推断是一种基于贝叶斯统计理论的推理方法。它通过使用概率论的知识&#xff0c;结合先验信息和观测数据&#xff0c;来更新对未知变量的推断。贝叶斯推断提供了一种合理的方法来处理不确定性&#xff0c;并…

https://是怎么实现的?

默认的网站建设好后都是http访问模式&#xff0c;这种模式对于纯内容类型的网站来说&#xff0c;没有什么问题&#xff0c;但如果受到中间网络劫持会让网站轻易的跳转钓鱼网站&#xff0c;为避免这种情况下发生&#xff0c;所以传统的网站改为https协议&#xff0c;这种协议自己…

地下工程中测斜仪的关键应用

地下工程&#xff0c;如隧道、地铁和基坑等项目的建设&#xff0c;对于现代城市的发展至关重要。然而&#xff0c;这些工程的实施往往伴随着诸多风险&#xff0c;特别是与周围土体的稳定性有关的风险。为了确保工程的安全进行&#xff0c;实时监测技术变得尤为关键。其中&#…

清理缓存简单功能实现

在程序开发中&#xff0c;经常会用到缓存&#xff0c;最常用的后端缓存技术有Redis、MongoDB、Memcache等。 而有时候我们希望能够手动清理缓存&#xff0c;点一下按钮就把当前Redis的缓存和前端缓存都清空。 功能非常简单&#xff0c;创建一个控制器类CacheController&#xf…

UBoat:一款功能强大的HTTP Botnet学习与研究工具

关于UBoat UBoat是一款功能强大的HTTP Botnet概念验证工具&#xff0c;该工具支持复刻一个现实场景中完整功能的Botnet测试环境&#xff0c;广大研究人员可以利用UBoat深入学习和研究Botnet的工作机制&#xff0c;以此来提升安全检测和保护策略。 功能介绍 1、基于C开发&…

废品回收微信小程序基于FastAdmin+ThinkPHP+UniApp(源码搭建/上线/运营/售后/更新)

一款基于FastAdminThinkPHPUniApp开发的废品回收系统&#xff0c;适用废品回收站、再生资源回收公司上门回收使用的小程序。 一、FastAdmin框架特色功能及优势 模块化开发&#xff1a;控制器、模型、视图、JS一一对应&#xff0c;使用RequireJS进行插件机制&#xff0c;支持插…

嵌入式全栈开发学习笔记---C语言笔试复习大全9

目录 二维数组 二维数组的初始化 遍历二维数组 二维数组的数组名 笔试题11 上一篇复习了一维数组&#xff0c;这一篇我们来复习二维数组。 说明&#xff1a;我们学过单片机的一般都是有C语言基础的了&#xff0c;网上关于C语言的资料有很多&#xff0c;大家如果对C语言不熟…