首页/新闻资讯/正文详情

LeetCode 1012题解:数位DP计算重复数字问题

发布时间:2026/11/5 12:31:03 来源:云帆数科 栏目:资讯中心
LeetCode 1012题解:数位DP计算重复数字问题
1. 问题解析LeetCode 1012至少有1位重复的数字这道题目要求我们计算从1到n的所有整数中至少有一位数字重复出现的数字个数。这类问题在算法竞赛和面试中属于经典题型主要考察数位动态规划Digit DP和组合数学的应用能力。1.1 问题重述与转化题目给出的函数签名为public int numDupDigitsAtMostN(int n)直接计算至少有一位重复的数字数量比较困难更聪明的做法是采用补集思想总数n本身无重复数字的数目计算所有数字都不相同的数字个数结果 总数 - 无重复数字的数目这种转化将问题简化为计算所有数字都不相同的数字个数这正是数位DP擅长的领域。1.2 数位DP基础概念数位DP是一种专门用于解决数字各位上数字满足特定条件问题的动态规划方法。其核心思想是将数字按位拆分处理记忆化已计算的状态通过限制条件控制数字范围对于本题我们需要记录以下状态当前处理到的数位位置已经使用的数字集合是否已经小于n的前缀决定当前位的选择范围2. 解决方案设计与实现2.1 组合数学解法我们可以将问题分解为计算所有位数不超过n的数字中不含重复数字的数目。对于k位数不含重复数字的数目计算如下第一位1-99种选择第二位0-9除去第一位9种选择第三位0-9除去前两位8种选择...第k位0-9除去前k-1位10-(k-1)种选择因此k位数中不含重复数字的数目为 9 × 9 × 8 × ... × (10 - k 1)2.2 数位DP实现细节以下是Java实现的详细解析public int numDupDigitsAtMostN(int n) { String s String.valueOf(n); int len s.length(); // 计算位数小于len的无重复数字数目 int total 0; for (int i 1; i len; i) { total 9 * permutation(9, i - 1); } // 计算位数等于len的无重复数字数目 boolean[] used new boolean[10]; for (int i 0; i len; i) { int digit s.charAt(i) - 0; for (int j (i 0 ? 1 : 0); j digit; j) { if (!used[j]) { total permutation(9 - i, len - i - 1); } } if (used[digit]) break; used[digit] true; } // 加上n本身是否无重复 boolean noDup true; for (int i 0; i 10; i) { if (count[i] 1) { noDup false; break; } } if (noDup) total; return n - total; } private int permutation(int n, int k) { if (k 0) return 1; return n * permutation(n - 1, k - 1); }2.3 关键步骤解析数字转换将n转换为字符串便于逐位处理小于位数的计算对于所有位数小于n的数字直接使用排列组合公式计算等于位数的计算从最高位开始处理对于每一位考虑所有小于当前数字的选择使用used数组记录已经使用的数字计算剩余位的排列可能性检查n本身最后需要单独检查n是否不含重复数字3. 复杂度分析与优化3.1 时间复杂度数字n的位数为dlog10(n)排列计算的时间复杂度为O(d)总体时间复杂度为O(d^2)3.2 空间复杂度只需要常数空间存储used数组递归深度为d总体空间复杂度为O(d)3.3 优化方向记忆化排列计算可以预计算阶乘表避免重复计算迭代实现改写递归为迭代减少函数调用开销位运算优化使用位掩码代替boolean数组记录已用数字4. 常见问题与调试技巧4.1 边界条件处理n0时应该返回0n10时直接返回01-9都没有重复数字注意数字首位不能为0的限制4.2 调试技巧小规模测试从n10开始逐步测试中间输出打印每一步的计算结果对比验证与暴力解法结果对比提示在面试中可以先提出暴力解法再优化为数位DP方案展示思考过程。5. 实际应用与变种5.1 实际应用场景这类问题在以下场景有实际应用密码强度检测限制重复数字序列号生成避免重复模式数据压缩利用数字唯一性5.2 相关变种题目计算不含连续相同数字的数目计算数字各位满足单调递增/递减的数目计算包含特定数字模式的数目6. 个人实现心得在实际编码中我发现以下几点特别重要数位处理顺序从高位到低位处理更符合直觉状态设计合理设计状态表示如used数组是关键排列计算单独提取为函数提高代码可读性边界检查最后别忘记检查n本身对于Java实现使用String处理数字比数学运算更直观。在性能要求高的场景可以改用数学方法处理数位。

相关推荐

SigmaWin+ 64位USB驱动安装与伺服调试连接指南
SigmaWin+ 64位USB驱动安装与伺服调试连接指南

简介:面向使用Yaskawa SigmaWin调试Σ系列伺服驱动器、变频器的工业自动化工程师与设备维护人员,这份64位USB驱动程序用于在Windows系统上建立计算机与设备间的稳定通信,解决软件无法识别硬件、联机编程与运行监控受阻的问题,适合… · 2026/11/4 13:27:36

防火墙安全区域部署实战:从规划到排障的完整指南
防火墙安全区域部署实战:从规划到排障的完整指南

防火墙部署安全区域这件事,说简单也简单,说复杂能让人掉不少头发。我做了十多年网络工程,参与过大小几十个安全域划分项目,从几十人的小办公网到上万终端的多分支园区都趟过。很多人以为把防火墙往网络出口一挂、配几条策略就完事… · 2026/11/4 14:47:12

SQL GROUP BY 核心原理与高级应用实战
SQL GROUP BY 核心原理与高级应用实战

1. GROUP BY的本质与核心价值GROUP BY是SQL中最强大的数据聚合工具之一,它允许我们按照指定列对结果集进行分组,然后对每个分组应用聚合函数(如COUNT、SUM、AVG等)。这就像在Excel中使用数据透视表,但具有更强大的灵活… · 2026/11/3 22:24:32

Text to SQL系统第三层实现:复杂查询意图识别与优化
Text to SQL系统第三层实现:复杂查询意图识别与优化

1. 项目概述Text to SQL系统作为自然语言处理与数据库技术交叉领域的重要应用,正在深刻改变着非技术人员与数据库交互的方式。这个看似简单的"输入问题,输出SQL"功能背后,隐藏着复杂的实现逻辑和技术挑战。今天我们就来拆解这个系统… · 2026/11/5 12:26:29

Text-to-SQL系统架构解析与性能优化实践
Text-to-SQL系统架构解析与性能优化实践

1. 文本到SQL转换系统的核心价值 在数据驱动的时代,SQL作为与数据库交互的标准语言,其重要性不言而喻。但编写SQL查询需要专业技能,这成为了许多非技术用户获取数据的障碍。Text-to-SQL系统正是为解决这一痛点而生,它允许用户用自… · 2026/11/5 12:26:29

钉钉办公自动化:OpenClaw Skill原理与应用
钉钉办公自动化:OpenClaw Skill原理与应用

1. 项目概述 OpenClaw Skill是一个基于自动化原理设计的办公效率工具,专门针对钉钉平台的操作优化。它能模拟人工操作流程,实现消息自动收发、审批流程处理、考勤数据管理等高频办公场景的自动化。我在实际使用中发现,这个工具特别适合需要频… · 2026/11/5 12:26:29

AI编程辅助工具:5个提升代码可用性的Prompt模板
AI编程辅助工具:5个提升代码可用性的Prompt模板

1. 项目背景与核心价值 去年团队引入AI编程辅助工具时,我们经历了从"玩具demo"到"生产级应用"的艰难跨越。最深的体会是:需求沟通的质量直接决定了AI产出的可用性。那些模糊的"做个用户管理系统"之类的需求,AI… · 2026/11/5 12:26:29

云原生智能体协同架构在城市轨道交通中的应用
云原生智能体协同架构在城市轨道交通中的应用

1. 新一代城市轨道交通云原生智能体协同架构概述城市轨道交通作为现代都市的"大动脉",其运营效率和服务质量直接影响着千万市民的日常生活。近年来,随着云计算、人工智能等技术的快速发展,传统的轨道交通智能化系统架构正面临着前所… · 2026/11/5 12:22:27

GD32E10x官方例程入门:从点灯到外设调试全流程
GD32E10x官方例程入门:从点灯到外设调试全流程

简介:这份GD32E10x系列官方例程面向使用兆易创新GD32E10x系列MCU的嵌入式开发者与初学者,基于ARM Cortex-M3内核,集合了从基础外设到通信、电机控制等场景的示例代码,可用于快速理解芯片用法并搭建工程。压缩包共935个文件&#x… · 2026/11/5 12:13:20

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07

多智能体协作系统架构设计与实践优化
多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39

大模型系统性入门实战指南:从原理到部署微调的全链路路线
大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39

鸿蒙文件系统沙箱机制解析与开发实践
鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码