news 2026/7/19 0:49:00

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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)`

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 0:48:58

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

LeetCode 3621. 位计数深度为 K 的整数数目 I Rust 实现rust impl Solution {pub fn popcount_depth(n: i64, k: i32) -> i64 {// k0&#xff1a;只有 1 的深度为 0if k 0 {return if n > 1 { 1 } else { 0 };}// 计算一个整数的 popcountfn pc(mut x: i32) -> i32 {…

作者头像 李华
网站建设 2026/7/19 0:24:37

双麦克风波束成型在免提通话中的DSP单芯片实现

免提通话的技术需求小型免提通话设备&#xff08;如手机、便携通信设备&#xff09;需要在喇叭/麦克风一体式结构中实现全双工通话。这种紧凑设计面临回音耦合强、空间有限、功耗敏感等挑战。NR37-CP采用DSP单芯片方案&#xff0c;通过双麦克风波束成型技术&#xff0c;为小型免…

作者头像 李华
网站建设 2026/7/19 0:14:37

【JVM调优实战】03-三大主流JVM实现横评

三大主流 JVM 实现横评:HotSpot、OpenJ9、GraalVM 怎么选 本文是《JVM调优实战》专栏第 3 讲。 引言 大多数 Java 开发者日常接触的 JVM 只有一个——HotSpot,它是 Oracle JDK 和 OpenJDK 的默认实现,也是绝大多数生产环境的标配。但 HotSpot 并不是唯一的选择,也不是所有…

作者头像 李华
网站建设 2026/7/19 0:12:54

RAG 系统里最危险的 BUG:它从不报错,只给出错误答案

一个数字让这件事变得无法回避 Tian Pan&#xff08;前 Uber/Brex 工程师&#xff09;在企业级 RAG 案例研究中记录了这样一个实验&#xff1a; 仅引入文档质量评分&#xff0c;不改变嵌入模型、不改变检索算法、不改变 Reranker&#xff0c;搜索准确率从 62% 提升至 89%&…

作者头像 李华
网站建设 2026/7/18 23:59:55

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述&#xff1a;为什么我们需要一个本地通信服务器&#xff1f;在游戏开发、数字孪生、仿真训练等众多领域&#xff0c;Unity作为强大的实时3D内容创作平台&#xff0c;其核心逻辑通常由C#驱动。然而&#xff0c;当我们需要进行复杂的数据分析、机器学习推理、科学计算…

作者头像 李华
网站建设 2026/7/18 23:59:41

2026最新工作能力评估推荐经过筛选的实用口碑选择建议

2026年针对职场提升工作处理效率的实用工具&#xff0c;我们结合效率工具爱好者的口碑反馈、多场景实际测试&#xff0c;筛选出了经市场验证的可靠选择&#xff0c;聚焦职场高频的语音信息处理、知识吸收类核心需求&#xff0c;按功能完整性、问题解决效率做分档推荐&#xff0…

作者头像 李华