【教3妹学编程-算法题】统计强大整数的数目

瑟瑟发抖

2哥 : 3妹,今年过年收到压岁钱了没呢。
3妹:切,我都多大了啊,肯定没收了啊
2哥 : 俺也一样,不仅没收到,小侄子小外甥都得给,还倒贴好几千
3妹:哈哈哈哈,2叔叔,也给我这个小侄女点压岁钱啊
2哥 :切,没啦没啦
3妹:话说你最大是多少岁开始没人给压岁钱了啊?
2哥:emmm, 大概是16岁,上高中开始的吧
3妹:那2哥,你收到的最大红包是多少呢
2哥:5千,是我奶奶给我的。
2哥:好吧,回家不仅只有压岁钱,也要刷题啊,今天有一道“最大”的题目, 让我们先做一下吧~

吃瓜

题目:

给你三个整数 start ,finish 和 limit 。同时给你一个下标从 0 开始的字符串 s ,表示一个 正 整数。

如果一个 正 整数 x 末尾部分是 s (换句话说,s 是 x 的 后缀),且 x 中的每个数位至多是 limit ,那么我们称 x 是 强大的 。

请你返回区间 [start…finish] 内强大整数的 总数目 。

如果一个字符串 x 是 y 中某个下标开始(包括 0 ),到下标为 y.length - 1 结束的子字符串,那么我们称 x 是 y 的一个后缀。比方说,25 是 5125 的一个后缀,但不是 512 的后缀。

示例 1:

输入:start = 1, finish = 6000, limit = 4, s = “124”
输出:5
解释:区间 [1…6000] 内的强大数字为 124 ,1124 ,2124 ,3124 和 4124 。这些整数的各个数位都 <= 4 且 “124” 是它们的后缀。注意 5124 不是强大整数,因为第一个数位 5 大于 4 。
这个区间内总共只有这 5 个强大整数。
示例 2:

输入:start = 15, finish = 215, limit = 6, s = “10”
输出:2
解释:区间 [15…215] 内的强大整数为 110 和 210 。这些整数的各个数位都 <= 6 且 “10” 是它们的后缀。
这个区间总共只有这 2 个强大整数。
示例 3:

输入:start = 1000, finish = 2000, limit = 4, s = “3000”
输出:0
解释:区间 [1000…2000] 内的整数都小于 3000 ,所以 “3000” 不可能是这个区间内任何整数的后缀。

提示:

1 <= start <= finish <= 10^15
1 <= limit <= 9
1 <= s.length <= floor(log10(finish)) + 1
s 数位中每个数字都小于等于 limit 。
s 不包含任何前导 0 。

思路:

思考
设 nums\textit{nums}nums 的异或和为 sss。

定义 dfs(i,limitLow,limitHigh)表示构造第 i位及其之后数位的合法方案数,其余参数的含义为:

limitHigh表示当前是否受到了 finish的约束(我们要构造的数字不能超过 finish。若为真,则第 iii 位填入的数字至多为 finish[i],否则至多为 9,这个数记作 hi。如果在受到约束的情况下填了 finish[i],那么后续填入的数字仍会受到 finish 的约束。例如 finish=123,那么 i=0填的是 1 的话,i=1的这一位至多填 2。
limitLow 表示当前是否受到了 start的约束(我们要构造的数字不能低于 start。若为真,则第 i位填入的数字至少为 start[i],否则至少为 0,这个数记作 lo。如果在受到约束的情况下填了 start[i],那么后续填入的数字仍会受到 start 的约束。

java代码:

class Solution {public long numberOfPowerfulInt(long start, long finish, int limit, String s) {String low = Long.toString(start);String high = Long.toString(finish);int n = high.length();low = "0".repeat(n - low.length()) + low; // 补前导零,和 high 对齐long[] memo = new long[n];Arrays.fill(memo, -1);return dfs(0, true, true, low.toCharArray(), high.toCharArray(), limit, s.toCharArray(), memo);}private long dfs(int i, boolean limitLow, boolean limitHigh, char[] low, char[] high, int limit, char[] s, long[] memo) {if (i == high.length) {return 1;}if (!limitLow && !limitHigh && memo[i] != -1) {return memo[i]; // 之前计算过}// 第 i 个数位可以从 lo 枚举到 hi// 如果对数位还有其它约束,应当只在下面的 for 循环做限制,不应修改 lo 或 hiint lo = limitLow ? low[i] - '0' : 0;int hi = limitHigh ? high[i] - '0' : 9;long res = 0;if (i < high.length - s.length) { // 枚举这个数位填什么for (int d = lo; d <= Math.min(hi, limit); d++) {res += dfs(i + 1, limitLow && d == lo, limitHigh && d == hi, low, high, limit, s, memo);}} else { // 这个数位只能填 s[i-diff]int x = s[i - (high.length - s.length)] - '0';if (lo <= x && x <= Math.min(hi, limit)) {res = dfs(i + 1, limitLow && x == lo, limitHigh && x == hi, low, high, limit, s, memo);}}if (!limitLow && !limitHigh) {memo[i] = res; // 记忆化 (i,false,false)}return res;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/468454.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QQ强制聊天,加好友。临时会话接口跳转单页源码

QQ互动增强工具&#xff1a;一键聊天、加好友与临时会话 &#x1f525; 全新体验&#xff0c;轻松连接 &#x1f525; 在数字社交时代&#xff0c;QQ仍然是我们与亲朋好友、工作伙伴沟通的重要桥梁。但有时候&#xff0c;复杂的设置和权限障碍让简单的“加个好友”或“说句话…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之LoadingProgress组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之LoadingProgress组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、LoadingProgress组件 用于显示加载动效的组件。 子组件 无 接口 L…

HDFS架构 之 服务视图

1 、简介 为实现以上特性,HDFS包含的各个服务模块都是经过精心设计的,HDFS的服务视图如图。 HDFS的服务视图包含三大部分:核心服务、公共服务和拓展服务。 2、 核心服务 1)Namenode。HDFS系统采用中心化设计,即Master/Slave架构。这里的Namenode即是Master,主要作用是管…

代码随想录算法训练营第十四天|二叉树理论基础、递归遍历、迭代遍历、统一迭代

代码随想录算法训练营第十四天|二叉树理论基础、递归遍历、迭代遍历、统一迭代 ● 二叉树理论基础● 1.基础理论&#xff08;1&#xff09;概念&#xff08;2&#xff09;性质 ● 二叉树的分类&#xff08;1&#xff09;满二叉树&#xff08;2&#xff09;完全二叉树&#xff0…

麦肯锡问题解决流程-为希望提升水平的产品经理量身定制

您是否想知道世界上最成功的产品经理如何始终如一地提供不仅满足而且超出预期的解决方案&#xff1f;秘密可能就在于世界上最负盛名的咨询公司之一麦肯锡公司所磨练的方法论。本文深入探讨了麦肯锡的问题解决流程&#xff0c;该流程专为希望提升水平的产品经理量身定制。 01. 麦…

AI - 碰撞避免算法分析(VO/RVO)

VO/RVO VO和RVO的原理本身理解起来比较简单的&#xff0c;就是根据两个圆形的相对半径&#xff0c;相对速度&#xff0c;相对位置&#xff0c;求出碰撞区域&#xff0c;然后将速度移出碰撞区域。VO是双方都是当作对方速度不变的情况下&#xff0c;各自都将速度完整的移出了会碰…

01.数据结构篇-链表

1.找出两个链表的交点 160. Intersection of Two Linked Lists (Easy) Leetcode / 力扣 例如以下示例中 A 和 B 两个链表相交于 c1&#xff1a; A: a1 → a2↘c1 → c2 → c3↗ B: b1 → b2 → b3 但是不会出现以下相交的情况&#xff0c;因为每个节点只有一个…

pycharm—配置python解释器【2023最新版】

目录 1.前言1.打开设置2. 点击到project >> Python interpreter3. 选择环境4. 确定之后等待加载就行了 1.前言 嗨嗨&#xff0c;大家好啊&#xff0c;我是小曼~ 刚入门python的伙伴们&#xff0c;一开始也会很多的问题。今天来给大家分享一下python新手必须学会的技巧 &…

关闭Windows 10自动更新方法

1. 关闭WindowsUpdate服务 如果你想要完全关闭Win10的自动更新功能&#xff0c;你可以在Windows服务中的WindowsUpdate选项里进行禁用设置。按照以下步骤&#xff0c;你就能完成操作。 按下“WinR”键&#xff0c;来启动“运行”&#xff0c;在运行中输入“services.msc”&…

监督学习:从数据中挖掘模式的引导

目录 前言1 定义2 举例说明3 回归问题4 分类问题结论 前言 监督学习是机器学习领域中的一种重要方法&#xff0c;通过给模型提供带有标签的训练数据&#xff0c;使其能够学习输入与输出之间的关系。这种学习方式在各个领域都有广泛的应用&#xff0c;从垃圾邮件过滤到医学诊断…

MATLAB 1:基础知识

MATLAB中的数据类型主要包括数值类型、逻辑类型、字符串、函数句柄、结构体和单元数组类型。这六种基本的数据类型都是按照数组形式存储和操作的。 MATLAB中还有两种用于高级交叉编程的数据类型&#xff0c;分别是用户自定义的面向对象的用户类类型和Java类类型。 1.1.1数值类…

Java+SpringBoot+Vue:高校科研管理的技术革新

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…