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

Kimi LeetCode 3621. 位计数深度为 K 的整数数目 I JavaScript实现

LeetCode 3621. 位计数深度为 K 的整数数目 I JavaScript 实现

```javascript
/**
* @param {number} n
* @param {number} k
* @return {number}
*/
var popcountDepth = function(n, k) {
// k=0:只有 1 的深度为 0
if (k === 0) {
return n >= 1 ? 1 : 0;
}

// 计算一个整数的 popcount(二进制 1 的个数)
const popcount = (x) => {
let cnt = 0;
while (x > 0) {
cnt += (x & 1);
x >>= 1;
}
return cnt;
};

// 预处理 1~60 的 popcount-depth
const depthMemo = new Array(65).fill(-1);
depthMemo[1] = 0;

const getDepth = (x) => {
if (x === 1) return 0;
if (depthMemo[x] !== -1) return depthMemo[x];
depthMemo[x] = 1 + getDepth(popcount(x));
return depthMemo[x];
};

// 找出所有满足 depth(c) == k-1 的 popcount 值 c
const targets = [];
for (let i = 1; i <= 60; i++) {
if (getDepth(i) === k - 1) {
targets.push(i);
}
}

if (targets.length === 0) return 0;

const s = n.toString(2); // n 的二进制字符串
const m = s.length;
let ans = 0;

for (const c of targets) {
// memo[pos][ones]:仅非 tight 状态有效
const memo = Array.from({ length: m }, () => new Array(c + 1).fill(null));

const dfs = (pos, ones, tight) => {
if (ones > c) return 0; // 1 的个数已超,剪枝
if (pos === m) {
return ones === c ? 1 : 0;
}

if (!tight && memo[pos][ones] !== null) {
return memo[pos][ones];
}

const limit = tight ? parseInt(s[pos]) : 1;
let res = 0;

for (let d = 0; d <= limit; d++) {
res += dfs(pos + 1, ones + d, tight && (d === limit));
}

if (!tight) {
memo[pos][ones] = res;
}
return res;
};

ans += dfs(0, 0, true);
}

// k=1 的特殊处理:popcount=1 包含 x=1,但 depth(1)=0,需排除
if (k === 1) {
ans -= 1;
}

return ans;
};
```

---

JavaScript 实现要点

要点 说明
`n.toString(2)` 将 `n` 转为二进制字符串,作为数位 DP 的上界
手动记忆化 用二维数组 `memo[pos][ones]` 存储非 `tight` 状态的结果(`null` 表示未计算)
闭包递归 `dfs` 作为闭包捕获 `s`、`m`、`c`、`memo`,避免全局污染
类型安全 `n ≤ 10¹⁵ < 2⁵³`,JavaScript `number` 可精确表示,无需 `BigInt`
k=1 修正 `popcount = 1` 会把 `x = 1` 算入,但其深度为 0,需减去

时间复杂度: `O(log² n)`

空间复杂度: `O(log² n)`

http://www.jsqmd.com/news/1216505/

相关文章:

  • 2026年大型化FD干燥机品牌综合实力排行盘点 - 奔跑123
  • 2026银行招聘培训优质机构推荐榜 - 互联网科技品牌测评
  • 2026 年开鲁热门的编码器组装机供应商深度解析与优选指南,揭秘!一个工具如何让你的生产效率翻倍 - 行业推荐官【官方】
  • 深圳劳力士回收价格查询和各大回收平台实测排行(2026年7月最新) - 天价名表回收平台
  • 深圳正规墨西哥物流公司盘点:5家合规服务商全维度解析 - 奔跑123
  • 【无线电】认知无线电网络中协作频谱感知研究(Matlab代码实现)
  • 冷链运输用干冰生产厂商联系方式获取及合规采购指引 - 热点品牌推荐
  • 劳力士中国官方售后服务中心|全部网点地址与热线权威信息公示(2026年7月更新) - 劳力士服务中心
  • 天津欧米茄回收价格查询和各大回收平台实测排行(2026年7月最新) - 诚收名表回收平台
  • FPGA实战(53):基于FPGA的8通道并行数字下变频(DDC)系统设计
  • springboot 技术学习 03 项目最小mvp
  • 鸿蒙三方库 | harmony-utils之FileUtil文件创建与删除详解
  • 如何恢复误删的ZFS文件@FreeBSD
  • AI 电动窗帘电机智能功率 覆盖 H 桥电机驱动、电源管理、传感器控制的完整选型方案
  • 2026年安徽五莲红火烧板批发商对接选品采购指南 - 热点品牌推荐
  • 2026年宁波工业围栏候选厂商综合测评指南 - 奔跑123
  • 2026年地区高铝耐火砖回收商挑选核心要点实用指南 - 热点品牌推荐
  • 保定FTC保温砂浆混合机生产厂家选型选购全指南 - 热点品牌推荐
  • 2026年工程采购普通石英砂热门厂家哪个好 - 热点品牌推荐
  • 一种欠定盲源分离方法及其在模态识别中的应用(Matlab代码实现)
  • U-Boot 基础指令精讲——环境变量、设备查询常用命令
  • 2026年走进宁波诚德兴观摩INS模内注塑成型实操场景 - 奔跑123
  • 青海选极窄钛合金门生产厂家实用选型全指南 - 热点品牌推荐
  • 2026年济南全域布局的食材配送服务正规推荐指南 - 奔跑123
  • 2026年中避暑攻略:知名留坝玩水纳凉地全推荐 - 品牌鉴赏官2026
  • 西安江诗丹顿回收价格查询与各大回收平台实测排行(2026年7月最新数据) - 收的高名表回收平台
  • Kimi LeetCode 3621. 位计数深度为 K 的整数数目 I Rust实现
  • 杭州爱彼回收价格查询和靠谱回收平台实测排行(2026年7月最新) - 嘉价奢侈品回收平台
  • 浏览器一次请求到底经历了什么?
  • 有生产扩能需求 洗瓶灌装一体化设备厂怎么联系才靠谱 - 热点品牌推荐