leetcode-338. 比特位计数

338. 比特位计数

class Solution {
/**
* @param Integer $n
* @return Integer[]
*/
function countBits($n) {
$ret = [0];
for ($i = 1; $i <=$n; $i++) {
// 上一个数字的比特位数
$curCount = $ret[$i - 1];
$curNum = $i - 1;
// 如果
while ($curNum >= 0) {
if ($curNum % 2 == 0) {
$ret[] = $curCount + 1;
break;
} else {
$curCount --;
$curNum = floor($curNum / 2);
}
}
}
return $ret;
}
}

我的思路是:

  • 前一个值是偶数,那么最后一位必然是 0,当前值的比特位数是前一个加一
  • 前一个值是奇数,那么当前值的比特位数是将后面的 1 全部去掉之后的第一个 0 处加一

官方题解中有三种动态规划题目,可以再研究研究

有一个人的题解比较有意思,找到了规律:
当前是奇数,那么上一个就是偶数,那么偶数加一之后 1 的个数加一
当前值是偶数,那么当前值/2 之后,1 的个数不变

于是就有:

  • 奇数 $ret[] = $ret[$i-1]+1;
  • 偶数 $ret[] = $ret[$i/2];
posted @   吴丹阳-V  阅读(46)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2020-06-14 从不订购的客户-leetcode
2020-06-14 查找重复的电子邮箱-leetcode
点击右上角即可分享
微信分享提示