【数位】【数论】【分类讨论】2999. 统计强大整数的数目
作者推荐
动态规划的时间复杂度优化
本文涉及知识点
数位 数论
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:0len−1(min(t[j],limit+1)−bitMin)×(limit+1)len−j−1
就是当前位的取值数量 乘以 后面各位的取值数量。如果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;
};
相关文章:
【数位】【数论】【分类讨论】2999. 统计强大整数的数目
作者推荐 动态规划的时间复杂度优化 本文涉及知识点 数位 数论 LeetCode2999. 统计强大整数的数目 给你三个整数 start ,finish 和 limit 。同时给你一个下标从 0 开始的字符串 s ,表示一个 正 整数。 如果一个 正 整数 x 末尾部分是 s (…...
MongoDB聚合运算符:$atan2
$atan2用来计算反正切,返回指定表达式的反正切值,与$antan的区别主要是参数不同。 语法 { $atan2: [<expression1>, <expression1>] }<expression>为可被解析为数值的表达式$atan2返回弧度,使用$radiansToDegrees运算符可…...
敏捷开发最佳实践:价值维度实践案例之ABTest中台化
22年敏捷白皮书调研发现,仅有14%的企业部分实现价值管理闭环,8%的企业能够做到企业战略和业务目标与价值管理紧密结合。这一现象说明了大部分中国企业还不能在敏捷实践中实现需求价值的体系化及多维度价值度量,因此推广优秀的敏捷实践至关重要…...
爬虫基本库的使用(requests库的详细解析)
注:本文一共4万多字,希望读者能耐心读完!!! 前面,我们了解了urllib库的基本用法(爬虫基本库的使用(urllib库的详细解析)-CSDN博客)。其中,确实又不方便的地方。例如处理网页验证…...
QT实现串口通信
一.Qt串口通信 Qt提供了两个关于串口通信的C类,分别是QSerialPort和QSerialPortInfo。 QSerialPort类提供了操作串口的各种接口。 QSerialPortInfo是一个辅助类,可以提供计算机中可用的串口的各种信息。 QSerialPortInfo Class用于提供外部串行端口的…...
微信小程序 --- 通用模块封装(showToast,showModal ,本地存储)
目录 01. 为什么进行模块封装 02. 消息提示模块封装 03. 模态对话框封装 04. 封装本地存储 API 05. 拓展:封装异步存储API优化代码 01. 为什么进行模块封装 在进行项目开发的时候,我们经常的会频繁的使用到一些 API, 例如:wx.showToast…...
基于springboot+vue的音乐网站(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 主要内容:毕业设计(Javaweb项目|小程序|Pyt…...
pclpy 最小二乘法拟合平面
pclpy 最小二乘法拟合平面 一、算法原理二、代码三、结果1.左边原点云、右边最小二乘法拟合平面后点云投影 四、相关数据 一、算法原理 平面方程的一般表达式为: A x B y C z D 0 ( C ≠ 0 ) Ax By Cz D 0 \quad (C\neq0) AxByCzD0(C0) 即: …...
蓝桥杯备战刷题(自用)
1.被污染的支票 #include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; int main() {int n;cin>>n;vector<int>L;map<int,int>mp;bool ok0;int num;for(int i1;i<n;i){cin>>nu…...
Python习题详解
练习: 1,计算100以内奇数的和 #计算100以内所有奇数的和 sum 0 # n 1 # while n < 100: # # sum sum n # sum n # # n n 2 # n 2 # print(sum) n 99 #求偶数时n 100 while n > 0:sum n# n n - 2n - 2 print(sum)2,打印直…...
绩效考核利器:Excel报表模板,解锁企业高效员工评价新境界
一、背景与目标 在现今的企业管理中,绩效考核是一项至关重要的任务。它旨在评估员工的工作表现,激励员工积极进取,同时也是制定薪酬、晋升、培训等决策的重要依据。为了满足这一需求,我们设计了一款绩效考核Excel报表模板&#x…...
如何使用Lychee+cpolar搭建本地私人图床并实现远程访问存储图片
文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站,可以看做是云存储的一部分,既可…...
跨境支付介绍
1、跨境电商定义和分类; 2、国际贸易清结算; 3、跨境支付; 1、跨境电商定义和分类 跨境电商业务简单说就是指不同国家地域的主体通过电子商务进行交易的一种业务模式。同传统的电商不同,交易双方属于不同的国家。因此࿰…...
如何在Linux搭建MinIO服务并实现无公网ip远程访问内网管理界面
文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼…...
Cortex-M可以跑Linux操作系统吗?
在开始前我有一些资料,是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! Cortex-M系列微控制器主要设计…...
日志系统项目(2)项目实现(实用工具类、日志等级类、日志消息类、日志格式化输出类)
前面的文章中我们讲述了日志系统项目的前置知识点,再本文中我们将开始日志项目的细节实现。 日志系统框架设计 本项目实现的是一个多日志器日志系统,主要实现的功能是让程序员能够轻松的将程序运行日志信息落地到指定的位置,且支持同步与异…...
剑指offer面试题19 二叉树的镜像
考察点 树的遍历知识点 题目 分析 我们分析算法题目的思路基本上都是归纳法,即通过举一些普通的例子来推理出算法流程,而画图又是举例子的常用手段,比如针对树或者链表画画图,针对数字类的举一些数字的例子寻找规律,…...
SpringCloud Alibaba 2022之Nacos学习
SpringCloud Alibaba 2022使用 SpringCloud Alibaba 2022需要Spring Boot 3.0以上的版本,同时JDK需要是17及以上的版本。具体的可以看官网的说明。 Spring Cloud Alibaba版本说明 环境搭建 这里搭建的是一个聚合项目。项目结构如下: 父项目的pom.xm…...
js之数组遍历
for 可以用来遍历数组、字符串、类数组、DOM节点,可以更改原数组,可以使用break、continue 跳出循环 return 只能在函数内部使用 for(声明循环变量;判断循环条件;更新循环变量){循环体 }forEach 参数(当前元素&#x…...
极狐GitLab 16.9 重磅发布,快来 pick 你心仪的功能吧~【五】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 沿袭我们的月度发版机制,今天我们正式发布极狐GitL…...
如何在本地部署密码管理软件bitwarden并结合cpolar实现远程同步
文章目录 1. 拉取Bitwarden镜像2. 运行Bitwarden镜像3. 本地访问4. 群晖安装Cpolar5. 配置公网地址6. 公网访问Bitwarden7. 固定公网地址8. 浏览器密码托管设置 Bitwarden是一个密码管理器应用程序,适用于在多个设备和浏览器之间同步密码。自建密码管理软件bitwarde…...
DT DAY3 信号和槽
作业: 1> 思维导图 2> 使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 btn3 new QPushButton("按钮3",this);btn3->resize(ui->btn2->width(),ui->b…...
Spring、SpringBoot、SpringCloud三者的区别
Spring、Spring Boot 和 Spring Cloud 是构建企业级 Java 应用程序的不同层次的框架和工具。下面详细介绍它们之间的区别: 1. Spring框架: 概述: Spring 是一个全功能的企业级 Java 框架,提供了依赖注入、面向切面编程、事务管理…...
leetcode:46.全排列
1.什么是排列? 有顺序!! 2.树形结构: 使用used数组进行标记取过的元素,一个元素一个元素地进行取值,取完之后将used数组进行标记。 3.代码实现:(循环从i0开始,而不是…...
基于STM32的宠物箱温度湿度监控系统
基于STM32的宠物箱温度湿度监控系统 一、引言 随着人们生活水平的提高,养宠物已经成为越来越多人的选择。宠物作为家庭的一员,其生活环境和健康状况受到了广泛关注。温度和湿度是影响宠物舒适度和健康的重要因素之一。因此,开发一款能够实时监控宠物箱温度和湿度的系统具有…...
《高质量的C/C++编程规范》学习
目录 一、编程规范基础知识 1、头文件 2、程序的板式风格 3、命名规则 二、表达式和基本语句 1、运算符的优先级 2、复合表达式 3、if语句 4、循环语句的效率 5、for循环语句 6、switch语句 三、常量 1、#define和const比较 2、常量定义规则 四、函数设计 1、参…...
客户端订阅服务端事件的机制
一、场景描述 产业大脑平台是一个典型的审核系统,用户发布到平台的信息需要经过审核员审核后生效。 用户发布信息->审核员审核信息->用户信息生效,这一流程可能发生在用户的同一次登录周期内。为了使客户端能实时响应信息的状态变化,…...
pulsar入门介绍
概述 Pulsar 是一个多租户、高性能的服务器到服务器消息传递解决方案。Pulsar 最初由 Yahoo 开发,由 Apache 软件基金会管理。 特点 Pulsar 的主要功能如下: 原生支持 Pulsar 实例中的多个集群,可跨集群无缝地复制消息。非常低的发布和端…...
Leetcode 3047. Find the Largest Area of Square Inside Two Rectangles
Leetcode 3047. Find the Largest Area of Square Inside Two Rectangles 1. 解题思路2. 代码实现 题目链接:3047. Find the Largest Area of Square Inside Two Rectangles 1. 解题思路 这道题倒是没啥特别的思路,直接暴力求解就是了,因此…...
ELK 简介安装
1、概念介绍 日志介绍 日志就是程序产生的,遵循一定格式(通常包含时间戳)的文本数据。 通常日志由服务器生成,输出到不同的文件中,一般会有系统日志、 应用日志、安全日志。这些日志分散地存储在不同的机器上。 日志…...
兰州网站订制/徐州百度推广公司
要想解决ie6背景不透明的方法有很多有简单有复杂的,所以在这里分享一个屡试不爽的方法,该方法只需要调用一个叫 iepng.js 的脚本即可让你彻底远离ie6 png背景不透明。 step1: 将iepng.js脚本放到js文件夹内 step2: 在<head></head>头部标签内…...
网站开发项目经验怎么写/软件排名工具
从全球范围看,自从上世纪80年代信息技术在企业应用中开始普及,至今一共经历了信息化、SaaS化、移动化和AI化四个阶段。 从信息化到AI化,每一次的技术升级以及基于新技术的企业服务升级都会驱动一波经济增长,中国企业与美国企业…...
济宁网站建设吊装/百度搜索关键词指数
前言在MySQL 8.0中,引入了不可见索引的新特性;不可见索引,是指实际存在但不会被优化器选用的索引。有童鞋就会问,不可见索引究竟有什么用?虽然在大多数情况下,业务系统新模块的上线,是需要经过充…...
wordpress如何免费导入音频/美国seo薪酬
原文地址 几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的完整副本,对大型项目来…...
宁波网站设计公司/无锡百度推广平台
一、算法 数据结构 程序 程序数据结构算法是由N.Wirth(沃斯)提出来的。 程序是计算机指令的某种组合,控制计算机的工作流程,完成一定的逻辑功能,以实现某种任务; 数据结构指的是数据与数据之间的逻辑关系。具有两个层面上的涵义…...
免费做app页面的网站/seo优化平台
新项目用的是react 用到了好多es6的语法,之前看过一遍阮一峰老师的 es6入门,最近发现好多地方理解的不是很深刻,所以又来了一遍,顺便对几个很实用的方法做一下总结 首先声明,这篇文章是转载的: 原文链接 &g…...