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

Kimi LeetCode 3463. 判断操作后字符串中的数字是否相等 II Rust实现

以下是 LeetCode 3463 的 Rust 实现,核心思路与 Python 版本一致:利用 Lucas 定理 分别计算组合数模 2 和模 5,再通过查表合并得到模 10 的结果。

完整代码

```rust
impl Solution {
pub fn has_same_digits(s: String) -> bool {
let n = s.len();
let bytes = s.as_bytes();
let mut num1 = 0i64; // 对应 s[0..n-2] 的最终结果
let mut num2 = 0i64; // 对应 s[1..n-1] 的最终结果

for i in 0..n - 1 {
let coefficient = Self::n_ck_mod10((n - 2) as i32, i as i32);
let digit1 = (bytes[i] - b'0') as i64;
let digit2 = (bytes[i + 1] - b'0') as i64;
num1 = (num1 + coefficient * digit1) % 10;
num2 = (num2 + coefficient * digit2) % 10;
}

num1 == num2
}

/// 计算 C(n, k) mod 10
fn n_ck_mod10(n: i32, k: i32) -> i64 {
let mod2 = Self::lucas_theorem(n, k, 2);
let mod5 = Self::lucas_theorem(n, k, 5);
// lookup[mod2][mod5] = C(n,k) mod 10
let lookup: [[i64; 5]; 2] = [
[0, 6, 2, 8, 4], // mod2 == 0
[5, 1, 7, 3, 9], // mod2 == 1
];
lookup[mod2 as usize][mod5 as usize]
}

/// Lucas 定理:计算 C(n, k) mod prime,prime 为质数
fn lucas_theorem(mut n: i32, mut k: i32, prime: i32) -> i64 {
let mut res = 1i64;
while n > 0 || k > 0 {
let n_mod = n % prime;
let k_mod = k % prime;
if k_mod > n_mod {
return 0;
}
res = (res * Self::small_comb(n_mod, k_mod)) % prime as i64;
n /= prime;
k /= prime;
}
res
}

/// 计算小组合数 C(n, k),其中 n, k 很小(0 <= n, k <= 4)
fn small_comb(n: i32, k: i32) -> i64 {
if k < 0 || k > n {
return 0;
}
// 预计算 0~4 的组合数
let comb = [
[1, 0, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 2, 1, 0, 0],
[1, 3, 3, 1, 0],
[1, 4, 6, 4, 1],
];
comb[n as usize][k as usize] as i64
}
}
```

关键点说明

要点 说明
Lucas 定理 将大组合数 C(n,k) 分解为 p 进制下各位小组合数的乘积,分别计算模 2 和模 5
small_comb Lucas 定理中每位数字最多为 4(因为 prime 最大为 5),直接预计算小组合数表,避免依赖外部库
lookup 表 通过中国剩余定理合并模 2 和模 5 的结果,得到唯一的模 10 值
时间复杂度 O(n \cdot \log_p n),其中 p \in \{2, 5\},对于 n \le 10^5 非常高效
空间复杂度 O(1),仅使用常数额外空间

算法原理简述

最终剩下的两个数字分别是原字符串两个子串的加权和,权重为组合数 C(n-2, i)。由于 n \le 10^5,直接模拟 O(n^2) 会超时。利用 Lucas 定理可以在 O(\log n) 时间内计算每个组合数模 10,从而将总复杂度降至 O(n \log n),轻松通过。

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

相关文章:

  • 3分钟掌握闲鱼数据智能采集:自动化市场洞察新方案
  • Android 7系统日志(三)liblog库—日志写入的完整链路
  • 小程序制作工具测评:餐宝盈/BBWEYY/比文云/Vev/Beacon(2026年7月更新)含零代码SAAS、AI编程、源码定制交付
  • 中小团队研发效能提升实战:基于 GitLab CI/CD 的自动化测试与发布流水线搭建
  • 永磁同步电机直接转矩控制原理与Simulink实现
  • Python解释器源代码:C语言里藏着灵魂,扩展嵌入一把梭,引爆你的编程脑洞
  • Kimi LeetCode 3454. 分割正方形 II C++实现
  • Android 高级工程师面试:Java 基础知识 近1年高频追问 22 题
  • Milvus、Qdrant、Chroma:向量数据库选型的工程决策
  • 小白也能看懂的大模型应用架构与Agent:让AI从“只会说“变成“会干活“
  • C# ConditionalAttribute 条件特性+Obsolete 废弃特性
  • stm32四轴飞行器BUG篇
  • 终极DLSS切换秘籍:3步解锁游戏性能新境界
  • CentOS8.0编译源码安装nginx和防火墙使用
  • 政企汇报宣传片为什么离不开 3D 动画?
  • PCB设计中孤铜现象的影响与AD18处理技巧
  • 奇门取号报“订单号不一致”?一次 trade_order_list 的排查实录
  • 《唤醒你的AI同事:WorkBuddy从零上手》034:提示词编写技巧
  • YOLO11全任务适配指南:检测、分割、姿态估计的性能调优技巧
  • 48. OrCAD在创建封装库时,管脚数目很多的元器件应该怎么合理?I Cadence Allegro 电子设计 快问快答
  • 设备单元级(L1)实施路径
  • 批量压缩图片还在用在线工具?这款648KB小软件,画质不变体积暴减
  • 不用喂食不用换水的“水族箱”、逆向净水器的智能水龙头,接入 Home Assistant、用 RF 破解把吊扇接入智能家居|DF创客周刊(第178期)
  • 星火X1 0725 vs 豆包:办公场景下AI模型精准能力实测
  • 混凝土裂隙数据集 建筑物裂缝分割数据集 1000张yolo数据集
  • 【AI编程代码审查黄金标准】:20年资深架构师亲授5大质量保障铁律,错过再等十年?
  • JMeter分布式压测实战:突破单机瓶颈,模拟海量并发
  • 高速PMSM无感控制三大难题与工程解决方案
  • ShadingModel与Lighting
  • ClaudeAPI 医疗场景落地指南:适用边界、提示词与审核流程