【数位】【数论】【分类讨论】2999. 统计强大整数的数目

news2026/4/2 1:18:51

作者推荐

动态规划的时间复杂度优化

本文涉及知识点

数位 数论

LeetCode2999. 统计强大整数的数目

给你三个整数 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 <= 1015
1 <= limit <= 9
1 <= s.length <= floor(log10(finish)) + 1
s 数位中每个数字都小于等于 limit 。
s 不包含任何前导 0 。

数论

len1 = s.length s1 = 下届.right(len1) s2 = 上届.right(len1)
枚举合法数字的长度len2。
我们当前数字假定除掉作为后缀的s,余下的部分为x,x的len = len2- len1。统计x的可能数量。难点:上下界可能包括limit以外的数字。
分类讨论:
一,x就是下界的前缀。
二,x就是上界的前缀。
三,x同时是上下界的前缀,做特殊处理,此时情况四不会存在。return (s1<=s)&&(s <= s2);
四,x 在上下界前缀之间。
处理余下的三种情况:
一,下界的前缀不包括limit及以上数字且s1 <= s,数量+1。
二,上界的前缀不包括limit及以上数字且s <= s2,数量+1。
三,小于上界前缀的数量-小于下界前缀的数量-等于下届前缀的数量。加上s后,一定在上下界之间。
等于下届前缀的数量:如果下届前缀不包括limit及以上数字,为1;否则为0。
小于下界(上界)前缀t的数量:
小于t的数量必定有j位前缀相同,j ∈ [ 0 , l e n ) \in[0,len) [0,len) 枚举j。
bitMin = (0==j)?1:0 最高位不能是0,其它位可以为0。
∑ j : 0 l e n − 1 ( m i n ( t [ j ] , l i m i t + 1 ) − b i t M i n ) × ( l i m i t + 1 ) l e n − j − 1 \sum_{j:0}^{len-1}(min(t[j],limit+1)-bitMin)\times (limit+1)^{len-j-1} j:0len1(min(t[j],limit+1)bitMin)×(limit+1)lenj1
就是当前位的取值数量 乘以 后面各位的取值数量。如果s[j]>=limit,则不会存在(j+1)位及更多位前缀相等。提前退出循环。

代码

核心代码

class Solution {
public:
	long long numberOfPowerfulInt(long long start, long long finish, int limit, string s) {
		m_s = s;
		m_limit = limit;
		const string strLow = std::to_string(start);
		const string strUp = std::to_string(finish);
		const int len0 = strLow.length();
		const int len = strUp.length();		
		m_vUnit.emplace_back(1);
		for (int i = 1; i <= 15; i++)
		{
			m_vUnit.emplace_back(m_vUnit.back() * (limit+1));
		}
		if (len0 == len)
		{
			return Do(strLow, strUp);
		}
		long long llRet = 0;
		llRet += Do(strLow, string(len0, limit+ '0'));
		for (int i = len0+1; i < len; i++)
		{
			llRet += Do(("1" + string(i - 1, '0')).c_str(), string(i, limit + '0').c_str());
		}	
		llRet +=Do (("1" + string(len - 1, '0')).c_str(), strUp.c_str());
		return llRet;
	}
	long long Do(string strLow, string strUp)
	{
		const int len = strLow.length() - m_s.length();
		if (len < 0 )
		{
			return 0;
		}
		auto [llCnt1, bVilid1] = LessEqual(len, strLow);
		auto [llCnt2, bVilid2] = LessEqual(len, strUp);
		bool b1 = (strLow.substr(len) <= m_s) && (bVilid1);
		bool b2 = (strUp.substr(len) >= m_s) && (bVilid2);
		if (strLow.substr(0,len) == strUp.substr(0,len))
		{
			return b1 && b2;
		}
		return (llCnt2 - llCnt1 - (bVilid1&&len)) + b1 + b2;
	}
	std::pair<long long, bool> LessEqual(int len,const string& s )
	{
		bool bVilid = true;
		long long llCnt = 0;
		for (int i = 0; i < len; i++)
		{//计算小于数量
			const int bitMin = (0 == i) ? 1 : 0;
			if (bVilid)
			{
				llCnt += (min(s[i] - '0', m_limit + 1) - bitMin) * m_vUnit[len - i - 1];
			}
			if (s[i] > m_limit + '0')
			{
				bVilid = false;
			}		
		}
		return make_pair(llCnt, bVilid);
	}
	vector<long long> m_vUnit;
	string m_s;
	int m_limit;
};

测试用例

template<class T,class T2>
void Assert(const T& t1, const T2& t2)
{
	assert(t1 == t2);
}

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
	if (v1.size() != v2.size())
	{
		assert(false);
		return;
	}
	for (int i = 0; i < v1.size(); i++)
	{
		Assert(v1[i], v2[i]);
	}

}

int main()
{
	long long start, finish;
	int limit;
	string s;
	{
		Solution sln;
		start = 1, finish = 1000000000000000, limit = 5, s = "1000000000000000";
		auto res = sln.numberOfPowerfulInt(start, finish, limit, s);
		Assert(1, res);
	}
	{
		Solution sln;
		start = 1829505, finish = 1955574, limit = 7, s = "11223";
		auto res = sln.numberOfPowerfulInt(start, finish, limit, s);
		Assert(0, res);
	}

	{
		Solution sln;
		start = 5398, finish = 6415, limit = 8, s = "101";
		auto res = sln.numberOfPowerfulInt(start, finish, limit, s);
		Assert(1, res);
	}
	{
		Solution sln;
		start = 1, finish = 6000, limit = 4, s = "124";
		auto res = sln.numberOfPowerfulInt(start, finish, limit, s);
		Assert(5, res);
	}
	{
		Solution sln;
		start = 15, finish = 215, limit = 6, s = "10";
		auto res = sln.numberOfPowerfulInt(start, finish, limit, s);
		Assert(2, res);
	}
	{
		Solution sln;
		start = 10, finish = 1844, limit = 5, s = "12";
		auto res = sln.numberOfPowerfulInt(start, finish, limit, s);
		Assert(12, res);
	}
	
	{
		Solution sln;
		start = 1, finish = 2000, limit = 8, s = "1";
		auto res = sln.numberOfPowerfulInt(start, finish, limit, s);
		Assert(162, res);
	}
	{
		Solution sln;
		start = 1829505, finish = 1255574165, limit =7, s = "11223";
		auto res = sln.numberOfPowerfulInt(start, finish, limit, s);
		Assert(5470, res);
	}
	{
		Solution sln;
		start = 15398, finish = 1424153842, limit = 8, s = "101";
		auto res = sln.numberOfPowerfulInt(start, finish, limit, s);
		Assert(783790, res);
	}
	
	
		
		
}

优化

n位数,可以看成包括(m-n)个前置0的m位数。

class Solution {
public:
	long long numberOfPowerfulInt(long long start, long long finish, int limit, string s) {
		m_s = s;
		m_limit = limit;
		string strLow = std::to_string(start);
		const string strUp = std::to_string(finish);
		if (strLow.length() < strUp.length())
		{
			strLow = string(strUp.length() - strLow.length(), '0')+strLow;
		}		
		m_vUnit.emplace_back(1);
		for (int i = 1; i <= 15; i++)
		{
			m_vUnit.emplace_back(m_vUnit.back() * (limit+1));
		}
		return Do(strLow, strUp);
	}
	long long Do(string strLow, string strUp)
	{
		const int len = strLow.length() - m_s.length();
		if (len < 0 )
		{
			return 0;
		}
		auto [llCnt1, bVilid1] = LessEqual(len, strLow);
		auto [llCnt2, bVilid2] = LessEqual(len, strUp);
		bool b1 = (strLow.substr(len) <= m_s) && (bVilid1);
		bool b2 = (strUp.substr(len) >= m_s) && (bVilid2);
		if (strLow.substr(0,len) == strUp.substr(0,len))
		{
			return b1 && b2;
		}
		return (llCnt2 - llCnt1 - (bVilid1&&len)) + b1 + b2;
	}
	std::pair<long long, bool> LessEqual(int len,const string& s )
	{
		bool bVilid = true;
		long long llCnt = 0;
		for (int i = 0; i < len; i++)
		{//计算小于数量
			if (bVilid)
			{
				llCnt += (min(s[i] - '0', m_limit + 1) - 0) * m_vUnit[len - i - 1];
			}
			if (s[i] > m_limit + '0')
			{
				bVilid = false;
			}		
		}
		return make_pair(llCnt, bVilid);
	}
	vector<long long> m_vUnit;
	string m_s;
	int m_limit;
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

邀请函 | 2024年数据技术嘉年华集结号已吹响,期待您参会!

龙腾四海内&#xff0c;风云际会时&#xff0c;2024年中国数据嘉年华如约而至。从起初小范围的网友聚会&#xff0c;到如今面向全国各地从业者、爱好者的年度集会&#xff0c;纵使岁月更迭&#xff0c;我们初心依旧。我们在各自最好的年华里共同见证了中国数据库行业的蓬勃发展…

MySQL-JDBC

1. JDBC介绍 JDBC&#xff08;Java Database Connectivity&#xff09;是 Java 连接数据库的标准接口&#xff0c;它提供了一种与数据库交互的统一方式&#xff0c;使得 Java 程序能够通过标准 API 访问和操作各种关系型数据库。 2. JDBC使用步骤 第0步&#xff1a;导bao 第1步…

TensorRT推理时,如何比对中间层的误差

TensorRT推理时,如何比对中间层的误差 有二种方案第二种方案的实现1.运行环境的搭建2.实现代码(compare_trt_onnxrt.py)3.运行4.输出 本文演示了TensorRT推理时,如何比对中间层的误差。 在做TensorRT推理加速时,可能会遇到精度问题,希望定位到是哪一个节点引起的误差,还是累计误…

10.vue学习笔记(组件数据传递-props回调函数子传父+透传Attributes+插槽slot)

文章目录 1.组件数据传递2.透传Attributes&#xff08;了解&#xff09;禁用Attributes继承 3.插槽slot3.1.插槽作用域3.2.默认内容3.3.具名插槽3.4.插槽中的数据传递3.5.具名插槽传递数据 1.组件数据传递 我们之前讲解过了组件之间的数据传递&#xff0c;props 和 自定义事件…

【IDEA】java 项目启动偶现Kotlin 版本问题 error:Kotlin:module was

一、问题描述&#xff1a; error:Kotlin:module was compiled with an incompatible version of kotlin the binary version of its metadata is二、问题原因&#xff1a; jar包版本冲突 三、解决方式&#xff1a; 1、Rebuild Project&#xff08;推荐☆&#xff09; 重新构…

小迪安全30WEB 攻防-通用漏洞SQL 注入CTF二次堆叠DNS 带外

#知识点&#xff1a; 1、数据库堆叠注入 根据数据库类型决定是否支持多条语句执行 2、数据库二次注入 应用功能逻辑涉及上导致的先写入后组合的注入 3、数据库 Dnslog 注入 解决不回显(反向连接),SQL 注入,命令执行,SSRF 等 4、黑盒模式分析以上 二次注入&…

2024.2.21 模拟实现 RabbitMQ —— 实现转发规则

目录 需求分析 直接交换机&#xff08;Direct &#xff09; 主题交换机&#xff08;Topic &#xff09; 扇出交换机&#xff08;Fanout &#xff09; Topic 交换机转发规则 routingKey 组成 bindingKey 组成 匹配规则 情况一 情况二 情况三 实现 Router 类 校验 b…

【AIGC大模型】跑通wonder3D (windows)

论文链接&#xff1a;https://arxiv.org/pdf/2310.15008.pdf windows10系统 显卡&#xff1a;NVIDIA rtx 2060 一、安装anaconda 二、安装CUDA 11.7 (CUDA Toolkit 11.7 Downloads | NVIDIA Developer) 和 cudnn 8.9.7(cuDNN Archive | NVIDIA Developer)库 CUDA选择自定…

【Android】坐标系

Android 系统中有两种坐标系&#xff0c;分别为 Android 坐标系和 View 坐标系。了解这两种坐标系能够帮助我们实现 View 的各种操作&#xff0c;比如我们要实现 View 的滑动&#xff0c;你连这个 View 的位置都不知道&#xff0c;那如何去操作呢&#xff1f; 一、Android 坐标…

【Spring Cloud】高并发带来的问题及常见容错方案

文章目录 高并发带来的问题编写代码修改配置压力测试修改配置&#xff0c;并启动软件添加线程组配置线程并发数添加Http取样配置取样&#xff0c;并启动测试访问message方法观察效果 服务雪崩效应常见容错方案常见的容错思路常见的容错组件 总结 欢迎来到阿Q社区 https://bbs.c…

《极简C++学习专栏》之结束语

朋友们&#xff0c;经过这么长的时间&#xff0c;《极简C学习专栏》的文章创作就要结束了&#xff0c;感谢你们一路陪伴&#xff01; 也希望你们能支持我接下来的其他专栏的创作&#xff01; 专栏的初衷 《极简C学习》专栏的初衷源自于我个人的学习笔记&#xff0c;记录下自己…

【刷题】牛客 JZ64 求1+2+3+...+n

刷题 题目描述思路一 &#xff08;暴力递归版&#xff09;思路二 &#xff08;妙用内存版&#xff09;思路三 &#xff08;快速乘法版&#xff09;思路四 &#xff08;构造巧解版&#xff09;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01…

Java 面向对象进阶 18 JDK8、9开始新增的方法;接口的应用;适配器设计模式;内部类(黑马)

一、JDK8开始新增的方法 默认方法不是抽象方法&#xff0c;所以不强制被重写&#xff1a; 但是如果被重写&#xff0c;就要去掉default关键字&#xff1a; public可以省略&#xff0c;但是default不可以省略&#xff1a; public是灰色的&#xff0c;代表可以省略 但是default是…

怎么把pdf转换成word?

怎么把pdf转换成word&#xff1f;Pdf和word在电脑上的使用非常广泛&#xff0c;pdf和word分别是由 Adobe和Microsoft 分别开发的电脑文件格式。PDF 文件可以在不同操作系统和设备上保持一致的显示效果&#xff0c;无论是在 Windows、Mac 还是移动设备上查看&#xff0c;都能保持…

使用Docker部署MinIO并结合内网穿透实现远程访问本地数据

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…

《绝地求生》提示msvcp140.dll丢失如何修复?分享5种靠谱的解决方法

在玩绝地求生&#xff08;PUBG&#xff09;游戏过程中&#xff0c;如果遇到系统弹出“提示请重新安装软件msvcp140.dll”的信息&#xff0c;这究竟是什么原因导致的呢&#xff1f;msvcp140.dll这个文件是Microsoft Visual C Redistributable Package的一部分&#xff0c;是许多…

服务器系统安全,10招教你维护服务器的安全

网络逐渐成为了我们生活中一部分。有人说&#xff0c;断WIFI是最厉害的一种惩罚手段&#xff0c;但是其实不然&#xff0c;最狠的莫过于网站的服务器遭受攻击&#xff0c;直接访问不了网页了&#xff0c;这时候就算有wifi我们也无能为力。服务器系统安全一直是管理者最关注的事…

这个元宵节,被云开发者安排了

元宵节快乐&#xff0c;同学们&#xff01;今天吃的汤圆都是什么馅儿的&#xff1f; 都说过了元宵&#xff0c;这个年才算是正式过完&#xff0c;2024年就算是正式开启。学堂君这里也准备了一份专属于开发者的小礼物&#xff0c;作为一点心意。 欢迎私信&#xff0c;发送暗号…

Ubuntu 某软件导致卡机如何 kill 掉进程

输入 top 查看现在系统的进程&#xff0c;记下该进程第一列的 pid 编号 kill [pid] 可以杀掉此进程 参考&#xff1a; Ubuntu下查看进程pid及结束无响应程序_终止3分钟内无响应的所有pid-CSDN博客

【OneAPI】节假日查询API

OneAPI新接口发布&#xff1a;节假日查询API 可查询指定月份、年份法定节假日及调休情况。 API地址&#xff1a;https://oneapi.coderbox.cn/openapi/public/holiday 请求参数 URL参数 参数名类型必须含义说明datestring否要查询的日期可按年或月查询&#xff0c;支持前缀…