2026-09-24:统计范围内的好整数。用go语言,有三个整数 l、r、k。 对于一个整数,把它写成十进制形式后,如果任意两个挨着的数字之间的差的绝对值都不超过 k,就认为这个整数满足条件。
2026-09-24统计范围内的好整数。用go语言有三个整数 l、r、k。对于一个整数把它写成十进制形式后如果任意两个挨着的数字之间的差的绝对值都不超过 k就认为这个整数满足条件。现在需要统计从 l 到 r 这个闭区间内包括 l 和 r一共有多少个满足条件的整数。其中两个数 x 和 y 的绝对差表示为 abs(x - y)。10 l r 1000000000000000。0 k 9。输入 l 10, r 15, k 1。输出 3。解释范围内的好整数有 10、11 和 12。对于 10abs(1 - 0) 1。对于 11abs(1 - 1) 0。对于 12abs(1 - 2) 1。所有这些差值都至多为 k 1。因此答案为 3。题目来自力扣3966。1. 把范围转成十进制字符串先把l和r转成十进制字符串lowS表示l的十进制形式highS表示r的十进制形式以highS的长度作为总位数n计算diffLH n - len(lowS)表示l比r少多少位。因为后面统一按r的位数来处理所以相当于在l的前面补上diffLH个前导零。例如l 10lowS 10r 15highS 15n 2diffLH 2 - 2 0。2. 定义记忆化数组准备一个二维记忆化数组memo第一维表示当前处理到第几位范围是0到n - 1第二维表示前一位数字范围是0到9初始值全部设为-1表示还没有计算过。它记录的是当当前位不受下界和上界限制时从第i位开始前一位数字为pre后面还能构造出多少个好数。3. 递归函数的含义递归函数大致有四个参数i当前正在处理第几位pre上一位已经填过的数字limitLow当前是否还受到下界l的限制limitHigh当前是否还受到上界r的限制。递归函数返回的是从第i位开始按照规则继续填数字最终能形成多少个好数。4. 递归终止条件如果i n说明所有位都已经处理完形成了一个完整的整数。这个整数一定在[l, r]范围内并且过程中已经检查过相邻数位差所以它是一个好数返回1。5. 记忆化查询与保存如果当前既不受下界限制也不受上界限制说明后面的数字可以自由选择只依赖于当前位数i前一位数字pre。这时先查memo[i][pre]如果已经计算过直接返回如果没有计算过就继续计算计算完后把结果保存到memo[i][pre]。这样避免重复计算相同状态。6. 确定当前位可选数字的上下界当前位能填哪些数字由下界和上界共同决定。下界lo默认下界是0。如果当前还受下界限制并且当前位已经到达l的有效位也就是i diffLH那么下界就取lowS中对应位置的数字对应下标是i - diffLH因为前面diffLH位是给l补的前导零。如果当前还在补前导零阶段即i diffLH那么下界仍然是0。上界hi默认上界是9。如果当前还受上界限制那么上界就是highS当前位的数字。7. 处理前导零和补位阶段如果当前还受下界限制并且当前位i diffLH说明还没有真正开始填有效数字还在补l前面的零。此时有两种选择继续不填有效数字也就是当前位仍然保持前导零相当于跳过这一位。递归到下一位置前一位记为0下界仍然受限制但上界不再受限制因为最高位填了0一定小于r的最高位。这个分支直接累加到结果中。从当前位开始填有效数字既然开始填有效数字就不能填0所以候选数字从1开始而不是从lo开始。8. 判断是否是第一位有效数字用isFirst表示当前是否正在填第一位有效数字。判断条件是当前还受下界限制并且当前位i diffLH。如果是第一位有效数字那么前面没有真正有效的相邻数字前导零不算相邻数位所以不需要检查abs(d - pre) k。如果不是第一位有效数字就必须检查当前要填的数字d和前一位数字pre的差的绝对值是否不超过k。9. 枚举当前位数字并递归当前位的候选数字从下界开始到上界结束。对于每一个候选数字d如果它是第一位有效数字直接允许否则检查abs(d - pre) k如果满足条件就递归处理下一位。递归时下一位的前一位数字变成d下界限制更新为原来是否受下界限制并且当前位是否正好等于下界lo上界限制更新为原来是否受上界限制并且当前位是否正好等于上界hi。把所有合法分支的结果累加起来就是当前状态的结果。10. 初始调用最开始从第0位开始前一位数字可以随便设为0同时既受下界限制也受上界限制。所以初始调用是位置0前一位0下界限制为真上界限制为真。最终返回的就是[l, r]范围内好整数的数量。例如题目样例l 10r 15k 1好整数有10、11、12因为10abs(1 - 0) 111abs(1 - 1) 012abs(1 - 2) 1其他数字如13、14、15的相邻差都超过1所以结果输出3。时间复杂度设n是r的十进制位数最大不超过16。递归状态主要由当前位数i最多n种前一位数字pre最多10种是否受下界限制最多2种是否受上界限制最多2种。但记忆化只在既不受下界限制也不受上界限制时生效因此实际记忆化状态是n × 10个。每个状态最多枚举当前位10个数字所以总计算量大约是O(n × 10 × 10) O(n)因为10 × 10是常数所以时间复杂度可以看作O(n)其中n是r的位数最大为16。额外空间复杂度额外空间主要来自记忆化数组memo大小是n × 10递归调用栈深度最多n层。所以总额外空间复杂度是O(n × 10 n) O(n × 10) O(n)同样因为n最大只有16实际空间非常小。Go完整代码如下packagemainimport(fmtstrconv)funcgoodIntegers(l,rint64,kint)int64{lowS:strconv.FormatInt(l,10)highS:strconv.FormatInt(r,10)n:len(highS)diffLH:n-len(lowS)memo:make([][10]int64,n)fori:rangememo{forj:rangememo[i]{memo[i][j]-1}}vardfsfunc(int,int,bool,bool)int64dfsfunc(i,preint,limitLow,limitHighbool)(resint64){ifin{return1// 找到一个好数}if!limitLow!limitHigh{p:memo[i][pre]if*p0{return*p}deferfunc(){*pres}()}lo:0iflimitLowidiffLH{loint(lowS[i-diffLH]-0)}hi:9iflimitHigh{hiint(highS[i]-0)}d:loiflimitLowidiffLH{// 不填数字上界不受约束resdfs(i1,0,true,false)d1// 下面填数字从 1 开始填}// 如果在 diffLH 之前填过数字那么 limitLow 一定是 falseisFirst:limitLowidiffLHfor;dhi;d{ifisFirst||abs(d-pre)k{resdfs(i1,d,limitLowdlo,limitHighdhi)}}return}// pre 的初始值随意returndfs(0,0,true,true)}funcabs(xint)int{ifx0{return-x}returnx}funcmain(){l:int64(10)r:int64(15)k:1result:goodIntegers(l,r,k)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-defgood_integers(l,r,k):low_sstr(l)high_sstr(r)nlen(high_s)diff_lhn-len(low_s)# memo[i][pre] 表示在位置 i前一位数字为 pre且不受上下界限制时的结果memo[[-1]*10for_inrange(n)]defdfs(i,pre,limit_low,limit_high):ifin:return1ifnotlimit_lowandnotlimit_high:ifmemo[i][pre]0:returnmemo[i][pre]res0lo0iflimit_lowandidiff_lh:loint(low_s[i-diff_lh])hi9iflimit_high:hiint(high_s[i])dlo# 如果还在补前导零阶段可以选择继续不填数字iflimit_lowandidiff_lh:resdfs(i1,0,True,False)d1# 接下来如果填数字从 1 开始is_firstlimit_lowandidiff_lhwhiledhi:ifis_firstorabs(d-pre)k:resdfs(i1,d,limit_lowanddlo,limit_highanddhi)d1ifnotlimit_lowandnotlimit_high:memo[i][pre]resreturnresreturndfs(0,0,True,True)if__name____main__:l10r15k1print(good_integers(l,r,k))C完整代码如下#includeiostream#includestring#includevector#includefunctional#includecstdlibusingnamespacestd;longlonggoodIntegers(longlongl,longlongr,intk){string lowSto_string(l);string highSto_string(r);intnhighS.size();intdiffLHn-lowS.size();vectorvectorlonglongmemo(n,vectorlonglong(10,-1));functionlonglong(int,int,bool,bool)dfs[](inti,intpre,boollimitLow,boollimitHigh)-longlong{if(in){return1;// 找到一个好数}if(!limitLow!limitHigh){if(memo[i][pre]0){returnmemo[i][pre];}}longlongres0;intlo0;if(limitLowidiffLH){lolowS[i-diffLH]-0;}inthi9;if(limitHigh){hihighS[i]-0;}intdlo;if(limitLowidiffLH){// 不填数字上界不受约束resdfs(i1,0,true,false);d1;// 下面填数字从 1 开始填}boolisFirstlimitLowidiffLH;for(;dhi;d){if(isFirst||abs(d-pre)k){resdfs(i1,d,limitLowdlo,limitHighdhi);}}if(!limitLow!limitHigh){memo[i][pre]res;}returnres;};returndfs(0,0,true,true);}intmain(){longlongl10;longlongr15;intk1;longlongresultgoodIntegers(l,r,k);coutresultendl;return0;}

相关新闻

yichen-skills 开发者指南:从 SKILL.md 到脚本,自建一个 AI Agent 技能全流程

yichen-skills 开发者指南:从 SKILL.md 到脚本,自建一个 AI Agent 技能全流程

yichen-skills 开发者指南:从 SKILL.md 到脚本,自建一个 AI Agent 技能全流程 【免费下载链接】yichen-skills 项目地址: https://gitcode.com/gh_mirrors/yi/yichen-skills yichen-skills 是一个面向内容创作者的开源 AI Agent 技能仓库&#x…

2026/9/25 20:51:52 阅读更多 →
国产OpenClaw来了!阿里QoderWork配TaoToken保姆级实战教程

国产OpenClaw来了!阿里QoderWork配TaoToken保姆级实战教程

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

2026/9/25 20:50:52 阅读更多 →
Langfuse 实战:部署、埋点、评估,跑通 LLM 可观测全流程(TaoToken 统一 Key 接入版)

Langfuse 实战:部署、埋点、评估,跑通 LLM 可观测全流程(TaoToken 统一 Key 接入版)

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

2026/9/25 20:50:52 阅读更多 →

最新新闻

Chrome HTTP页面调用摄像头麦克风的三大合规方案

Chrome HTTP页面调用摄像头麦克风的三大合规方案

1. 这不是“绕过安全限制”,而是理解Chrome的媒体访问信任模型你搜到这个标题时,大概率正卡在一个具体场景里:比如在局域网内调试一个基于HTTP协议的视频会议页面、用树莓派搭了个带摄像头的本地监控系统、或者正在对接宇视/海康的某款设备We…

2026/9/25 22:20:51 阅读更多 →
Via浏览器主页配置:轻量级前端工程实践指南

Via浏览器主页配置:轻量级前端工程实践指南

1. 这不是“改个首页”那么简单:Via浏览器主页配置的本质是轻量级前端工程实践Via浏览器主页配置,表面看只是把一个HTML文件设为启动页,但实际操作中,它迅速演变成一场微型前端开发实战——没有构建工具、没有热更新、没有调试面板…

2026/9/25 22:20:51 阅读更多 →
Agent 到底什么时候该用?FDE 如何设计一个生产级 AI Agent

Agent 到底什么时候该用?FDE 如何设计一个生产级 AI Agent

Agent 到底什么时候该用?FDE 如何设计一个生产级 AI Agent 专栏:《AI FDE 实战:从 Demo 到生产》|第 12 篇 / 共 18 篇 本篇目标:为模型的自主行动划定可执行的边界,让一个多步骤任务能够暂停、恢复、停止&…

2026/9/25 22:20:51 阅读更多 →
客户维护的重复点击,该交给工具了

客户维护的重复点击,该交给工具了

重复点击不是体力活,是流程漏洞维护客户关系时,写一句话通常不费劲。费劲的是:从通讯录里反复挑选联系人、在多个窗口间切换、核对谁还没发、中断后重新整理名单。这些操作没有技术含量,却占用了大量时间,而且容易出错…

2026/9/25 22:20:51 阅读更多 →
大促封网期 GPU 平台值守手册:红线看板与 XID 故障快速摘除 Runbook

大促封网期 GPU 平台值守手册:红线看板与 XID 故障快速摘除 Runbook

大促封网期 GPU 平台值守手册:红线看板与 XID 故障快速摘除 Runbook在大促正式进入封网(Infra Freeze)的值守作战阶段,AI 基础设施团队必须从“建设与压测模式”全面切换至“最高战备值守模式”。在夜间零点流量洪峰过境时&#x…

2026/9/25 22:20:51 阅读更多 →
FDE 实战:给 AI 加上 Tool Calling,让模型真正操作业务系统

FDE 实战:给 AI 加上 Tool Calling,让模型真正操作业务系统

FDE 实战:给 AI 加上 Tool Calling,让模型真正操作业务系统 专栏:《AI FDE 实战:从 Demo 到生产》|第 11 篇 / 共 18 篇 本篇目标:让模型通过受控工具查询订单、形成工单草稿,并由独立的人工确认…

2026/9/25 22:19:51 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →