news 2026/7/19 0:48:58

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kimi LeetCode 3621. 位计数深度为 K 的整数数目 I Rust实现

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

```rust
impl Solution {
pub fn popcount_depth(n: i64, k: i32) -> i64 {
// k=0:只有 1 的深度为 0
if k == 0 {
return if n >= 1 { 1 } else { 0 };
}

// 计算一个整数的 popcount
fn pc(mut x: i32) -> i32 {
let mut cnt = 0;
while x > 0 {
cnt += x & 1;
x >>= 1;
}
cnt
}

// 预处理 1~60 的 popcount-depth
let mut depth = vec![-1; 65];
depth[1] = 0;

fn get_depth(x: i32, depth: &mut Vec<i32>) -> i32 {
if x == 1 {
return 0;
}
if depth[x as usize] != -1 {
return depth[x as usize];
}
let d = 1 + get_depth(pc(x), depth);
depth[x as usize] = d;
d
}

// 找出所有满足 depth(c) == k-1 的 popcount 值 c
let mut targets = vec![];
for i in 1..=60 {
if get_depth(i, &mut depth) == k - 1 {
targets.push(i);
}
}

if targets.is_empty() {
return 0;
}

// n 的二进制表示,按位存储
let bits: Vec<u8> = format!("{:b}", n).bytes().map(|b| b - b'0').collect();
let m = bits.len();
let mut ans = 0i64;

for &c in &targets {
// memo[pos][ones],仅非 tight 状态有效,-1 表示未计算
let mut memo = vec![vec![-1i64; (c + 1) as usize]; m];

fn dfs(
pos: usize,
ones: i32,
tight: bool,
bits: &Vec<u8>,
c: i32,
memo: &mut Vec<Vec<i64>>,
) -> i64 {
if ones > c {
return 0; // 1 的个数已超,剪枝
}
if pos == bits.len() {
return if ones == c { 1 } else { 0 };
}

if !tight && memo[pos][ones as usize] != -1 {
return memo[pos][ones as usize];
}

let limit = if tight { bits[pos] } else { 1 };
let mut res = 0i64;

for d in 0..=limit {
res += dfs(
pos + 1,
ones + d as i32,
tight && (d == limit),
bits,
c,
memo,
);
}

if !tight {
memo[pos][ones as usize] = res;
}
res
}

ans += dfs(0, 0, true, &bits, c, &mut memo);
}

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

ans
}
}
```

---

Rust 实现要点

要点 说明
`format!("{:b}", n)` 将 `n` 转为二进制字符串,再拆分为 `Vec<u8>` 逐位处理
内部递归函数 `dfs` 作为独立函数接收所有必要参数(闭包递归在 Rust 中较繁琐)
记忆化数组 `memo[pos][ones]` 用 `-1` 标记未计算,仅 `tight = false` 时写入复用
`i64` 返回值 `n ≤ 10¹⁵`,答案在 `i64` 范围内;`pc` 用 `i32` 即可(`x ≤ 60`)
k=1 修正 `c = 1` 时会把 `x = 1` 算入,但其深度为 0,需减去

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

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

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

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

28.04%全球效率新纪录!有机叠层太阳能电池仿真研发原理

央视新闻重磅报道&#xff0c;中国科学院化学所实现太阳能电池颠覆性突破&#xff1a;自主研发的钙钛矿——有机叠层太阳能电池&#xff0c;经权威认证光电转换效率高达28.04%&#xff0c;成功刷新全球世界纪录。这款轻薄可弯折、曲面随心贴的新一代光伏器件&#xff0c;从超薄…

作者头像 李华