第143场双周赛:最小可整除数位乘积 Ⅰ、执行操作后元素的最高频率 Ⅰ、执行操作后元素的最高频率 Ⅱ、最小可整除数位乘积 Ⅱ
Q1、最小可整除数位乘积 Ⅰ
1、题目描述
给你两个整数 n
和 t
。请你返回大于等于 n
的 最小 整数,且该整数的 各数位之积 能被 t
整除。
2、解题思路
-
问题拆解:
-
题目要求我们找到一个整数,其 数位的积 可以被
t
整除。 -
数位的积 是指将数字的每一位相乘后的结果,例如
123
的数位积为 1 × 2 × 3 = 6 1 \times 2 \times 3 = 6 1×2×3=6。 -
如果某个数字包含
0
,那么其数位积为0
,此时无法被t
整除。
-
-
算法设计:
-
从整数
n
开始依次检查每个数字,直到找到第一个满足条件的数字。 -
对于每个数字,计算其 数位积,然后判断是否可以被
t
整除。 -
如果可以被
t
整除,则返回该数字;否则继续检查下一个数字。
-
-
辅助函数:
digitProduct
:-
计算一个整数的数位积。
-
如果数字中包含
0
,则直接返回0
,因为数位积为0
。
-
-
边界情况:
-
如果
t = 1
,那么任何数字都满足条件,因此直接返回n
。 -
如果
t > 1
,需要依次检查数字,直到找到满足条件的数字。
-
3、代码实现
class Solution {
public:int smallestNumber(int n, int t) {// 从 n 开始检查int cur = n;while (true) {// 如果当前数字的数位积可以被 t 整除, 返回当前数字if (digitProduct(cur) % t == 0) {return cur;}cur++; // 检查下一个数字}return -1; // 理论上永远不会到达这里}// 辅助函数: 计算一个数字的数位积int digitProduct(int x) {// 初始化数位积为 1int product = 1;while (x > 0) {// 取当前数字的最低位int digit = x % 10;if (digit == 0) {// 如果包含 0, 则数位积为 0return 0;}// 更新数位积product *= digit;// 去掉最低位x /= 10;}// 返回最终的数位积return product;}
};
4、复杂度分析
时间复杂度分析
- 数字检查:
- 最坏情况下,从
n
开始逐一递增检查,直到找到满足条件的数字。设答案为n + k
,最多需要检查k
个数字。
- 最坏情况下,从
- 数位积计算:
- 对于每个数字,计算数位积的复杂度与其位数成正比,假设数字最大有
O(\log n)
位。
- 对于每个数字,计算数位积的复杂度与其位数成正比,假设数字最大有
总时间复杂度:
- 最坏情况下,复杂度为 O ( k × log n ) O(k \times \log n) O(k×logn),其中
k
是找到满足条件的数字所需的检查次数。
Q2、执行操作后元素的最高频率 Ⅰ
Q3、执行操作后元素的最高频率 Ⅱ
这两题答案一样,放在一起
1、题目描述
给你一个整数数组 nums
和两个整数 k
和 numOperations
。
你必须对 nums
执行 操作 numOperations
次。每次操作中,你可以:
- 选择一个下标
i
,它在之前的操作中 没有 被选择过。 - 将
nums[i]
增加范围[-k, k]
中的一个整数。
在执行完所有操作以后,请你返回 nums
中出现 频率最高 元素的出现次数。
一个元素 x
的 频率 指的是它在数组中出现的次数。
2、解题思路
本问题的核心是如何利用 numOperations
次操作,通过调整数组元素的值来使得某个元素的频率最大化。
解法 1:基于前缀和的差分数组优化
- 使用差分数组记录可调整的范围:
- 对于数组中每个元素
num
,可以通过增加范围[−k,k]
内的整数,将num
的值调整到[num−k,num+k]
。 - 利用差分数组
diff
来记录调整范围的增减:- 在
diff[num-k]
位置加 1,表示从该位置开始可以增加 1。 - 在
diff[num+k+1]
位置减 1,表示该位置之后的值减少 1。
- 在
- 通过遍历
diff
,累加值即可知道每个数的覆盖频率。
- 对于数组中每个元素
- 结合操作次数限制:
- 直接记录数组中每个数
num
的原始频率cnt[num]
。 - 更新累积频率时,确保频率不超过
cnt[num] + numOperations
。
- 直接记录数组中每个数
- 计算最大频率:
- 遍历差分数组,动态更新每个数的最大频率。
解法1:代码实现
class Solution {
public:int maxFrequency(vector<int>& nums, int k, int numOperations) {unordered_map<int, int> cnt; // 原始频率表map<int, int> diff; // 差分数组// 初始化频率表和差分数组for (const auto& num : nums) {cnt[num]++; // 记录每个数的原始频率diff[num]; // 确保下面遍历的时候能够遍历到diff[num - k]++; // 差分数组起点加 1diff[num + k + 1]--; // 差分数组终点减 1}int ret = 0, count = 0;// 遍历差分数组, 动态更新频率for (const auto& [num, c] : diff) {count += c; // 累加当前数的频率变化ret = max(ret, min(count, cnt[num] + numOperations)); // 计算最大频率}return ret;}
};
解法 2:基于滑动窗口的区间扩展
- 排序数组:
- 通过排序,方便计算将某个值扩展到某范围的成本,特别是考虑连续区间的情况下。
- 排序后,如果将
nums[right]
扩展到等于nums[left]
,可以更高效地计算操作次数。
- 双层滑动窗口:
- 第一部分:统计当前元素 x 的最大频率。
- 遍历数组时,动态更新窗口内与
x
可调整范围内的值个数。
- 遍历数组时,动态更新窗口内与
- 第二部分:优化操作,统计全局范围内的频率最大值。
- 第一部分:统计当前元素 x 的最大频率。
- 边界处理:
- 如果可以直接达到
numOperations
次操作,直接返回结果。
- 如果可以直接达到
解法2:代码实现
class Solution {
public:int maxFrequency(vector<int>& nums, int k, int numOperations) {ranges::sort(nums); // 排序数组int n = nums.size();int ret = 0, cnt = 0, left = 0, right = 0;// 计算当前值 x 的最大频率for (int i = 0; i < n; ++i) {int x = nums[i];cnt++; // 当前 x 的频率增加if (i < n - 1 && x == nums[i + 1]) {continue; // 跳过连续相同元素}// 调整左、右边界, 统计 x 的最大频率while (nums[left] < x - k) {left++;}while (right < n && nums[right] <= x + k) {right++;}ret = max(ret, min(right - left, cnt + numOperations));cnt = 0; // 重置计数}if (ret >= numOperations) {return ret;}// 优化: 全局范围统计最大频率left = 0;for (int right = 0; right < n; ++right) {int x = nums[right];while (nums[left] < x - k * 2) {left++;}ret = max(ret, right - left + 1);}return min(ret, numOperations);}
};
3、复杂度分析
两种解法的对比
解法 | 时间复杂度 | 空间复杂度 | 适用场景 |
---|---|---|---|
解法 1(差分数组) | O ( n log n ) O(n \log n) O(nlogn) | O ( n ) O(n) O(n) | 适用于需要精确调整每个数范围的场景 |
解法 2(滑动窗口) | O ( n log n ) O(n \log n) O(nlogn) | O ( 1 ) O(1) O(1) | 适用于连续区间扩展、排序后处理的问题 |
Q4、最小可整除数位乘积 Ⅱ
1、题目描述
给你一个字符串 num
,表示一个 正 整数,同时给你一个整数 t
。
如果一个整数 没有 任何数位是 0 ,那么我们称这个整数是 无零 数字。
请你返回一个字符串,这个字符串对应的整数是大于等于 num
的 最小无零 整数,且 各数位之积 能被 t
整除。如果不存在这样的数字,请你返回 "-1"
。
2、解题思路
-
因子分解检查:
- 如果
t
包含大于 7 的质因子(如 11, 13 等),无法找到符合条件的整数,因为我们只能用1-9
的数位组成数字,且这些数位的乘积无法包含大于 7 的质因子。
- 如果
-
前缀 GCD 检查:
-
对
num
逐位计算其数位乘积和t
的 GCD。 -
如果整个
num
的数位乘积已经满足t
的整除条件,直接返回num
。
-
-
调整当前数字:
- 如果
num
的乘积不能整除t
,需要从低位到高位尝试调整数字:- 增大某一位数字,使得新的数位乘积可以整除
t
。 - 从调整的位后面开始重新构造数字,确保是最小无零整数。
- 增大某一位数字,使得新的数位乘积可以整除
- 如果
-
增加数字长度:
-
如果调整当前数字无法满足条件,则结果一定比
num
长。 -
将
t
分解为2−9
的因子组合,构造最小无零整数。
-
3、代码实现
class Solution {
public:string smallestNumber(string s, long long t) {// 检查 t 是否包含大于 7 的质因子long long temp = t;for (int i = 9; i > 1; i--) {while (temp % i == 0) {temp /= i;}}// t 包含大于 7 的质因子, 无法生成符合条件的数字if (temp > 1) {return "-1";}// 数字的长度int n = s.length();// gcdPrefix[i] 表示从左到第 i 个字符的 gcd 前缀vector<long long> gcdPrefix(n + 1, 0);gcdPrefix[0] = t;// 第一个 0 出现的位置, 默认为最后一位int firstZeroIndex = n - 1;// 计算前缀 gcd 并找到第一个 0for (int i = 0; i < n; i++) {if (s[i] == '0') {// 记录第一个 0 出现的位置firstZeroIndex = i;break;}gcdPrefix[i + 1] = gcdPrefix[i] / gcd(gcdPrefix[i], s[i] - '0');}// 如果 num 的各位乘积是 t 的倍数, 直接返回 numif (gcdPrefix[n] == 1) {return s;}// 尝试调整 num, 使其成为满足条件的最小无零数字for (int i = firstZeroIndex; i >= 0; i--) {while (++s[i] <= '9') {long long reducedT = gcdPrefix[i] / gcd(gcdPrefix[i], s[i] - '0');// 当前可用的最大数字int maxDigit = 9;for (int j = n - 1; j > i; j--) {while (reducedT % maxDigit != 0) {// 寻找下一个可用的最大数字maxDigit--;}reducedT /= maxDigit;// 更新当前数字s[j] = '0' + maxDigit;}if (reducedT == 1) {// 找到满足条件的最小无零数字return s;}}}// 如果无法通过调整当前 num 实现目标, 答案一定比 num 长string result;for (int i = 9; i > 1; i--) {while (t % i == 0) {result += '0' + i;t /= i;}}// 补充剩余的位数为 1result += string(max(n + 1 - (int)result.length(), 0), '1');// 反转字符串以得到最终结果reverse(result.begin(), result.end());return result;}
};
4、复杂度分析
- 时间复杂度:
- 因子分解检查: O ( log t ) O(\log t) O(logt)。
- 前缀 GCD 计算: O ( n ) O(n) O(n),其中 n 是
num
的长度。 - 数字调整:最多尝试 O ( n × log t ) O(n \times \log t) O(n×logt)。
- 整体复杂度: O ( n × log t ) O(n \times \log t) O(n×logt)。
空间复杂度:
- 使用了前缀 GCD 数组,空间复杂度为 O ( n ) O(n) O(n)。
相关文章:

第143场双周赛:最小可整除数位乘积 Ⅰ、执行操作后元素的最高频率 Ⅰ、执行操作后元素的最高频率 Ⅱ、最小可整除数位乘积 Ⅱ
Q1、最小可整除数位乘积 Ⅰ 1、题目描述 给你两个整数 n 和 t 。请你返回大于等于 n 的 最小 整数,且该整数的 各数位之积 能被 t 整除。 2、解题思路 问题拆解: 题目要求我们找到一个整数,其 数位的积 可以被 t 整除。 数位的积 是指将数…...

【STM32】LED状态翻转函数
1.利用状态标志位控制LED状态翻转 在平常编写LED状态翻转函数时,通常利用状态标志位实现LED状态的翻转。如下所示: unsigned char led_turn_flag; //LED状态标志位,1-点亮,0-熄灭/***************************************函…...

uniapp 小程序 textarea 层级穿透,聚焦光标位置错误怎么办?
前言 在开发微信小程序时,使用 textarea 组件可能会遇到一些棘手的问题。最近我在使用 uniapp 开发微信小程序时,就遇到了两个非常令人头疼的问题: 层级穿透:由于 textarea 是原生组件,任何元素都无法遮盖住它。当其…...

汽车 SOA 架构下的信息安全新问题及对策漫谈
摘要:随着汽车行业的快速发展,客户和制造商对车辆功能的新需求促使汽车架构从面向信号向面向服务的架构(SOA)转变。本文详细阐述了汽车 SOA 架构的协议、通信模式,并与传统架构进行对比,深入分析了 SOA 给信…...

Unity-Mirror网络框架-从入门到精通之RigidbodyPhysics示例
文章目录 前言示例一、球体的基础配置二、三个球体的设置差异三、示例意图LatencySimulation前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Unity的开…...

小程序如何引入腾讯位置服务
小程序如何引入腾讯位置服务 1.添加服务 登录 微信公众平台 注意:小程序要企业版的 第三方服务 -> 服务 -> 开发者资源 -> 开通腾讯位置服务 在设置 -> 第三方设置 中可以看到开通的服务,如果没有就在插件管理中添加插件 2.腾讯位置服务…...

H3CNE-12-静态路由(一)
静态路由应用场景: 静态路由是指由管理员手动配置和维护的路由 路由表:路由器用来妆发数据包的一张“地图” 查看命令: dis ip routing-table 直连路由:接口配置好IP地址并UP后自动生成的路由 静态路由配置: ip…...

多线程锁
在并发编程中,锁(Lock)是一种用于控制多个线程对共享资源访问的机制。正确使用锁可以确保数据的一致性和完整性,避免出现竞态条件(Race Condition)、死锁(Deadlock)等问题。Java 提供…...

ZooKeeper 核心知识全解析:架构、角色、节点与应用
1.ZooKeeper 分布式锁怎么实现的 ZooKeeper 是一个高效的分布式协调服务,它提供了简单的原语集来构建更复杂的同步原语和协调数据结构。利用 ZooKeeper 实现分布式锁主要依赖于它的顺序节点(Sequential Node)特性以及临时节点(Ep…...

笔记本电脑 选购 回收 特权模式使用 指南
笔记本电脑 factor 无线网卡:有些笔记本无法检测到特定频段的信息,会导致连不上校园网 sudo iwlist wlp2s0 scan | grep Frequency > net.txt cat net.txt>表示用终端输出覆盖后续文件,>>表示添加到后续文件的末尾 一种更简…...

2023-2024 学年 广东省职业院校技能大赛(高职组)“信息安全管理与评估”赛题一
2023-2024 学年 广东省职业院校技能大赛(高职组“信息安全管理与评估”赛题一) 模块一:网络平台搭建与设备安全防护第一阶段任务书任务 1:网络平台搭建任务 2:网络安全设备配置与防护DCRS:DCFW:DCWS:DCBC:WAF: 模块二:网络安全事件…...

C#补充----反射,特性,迭代器,特殊语法,值类型运用类型。
1.反射:通过type 获取类中的数据。创建实例,并赋值。 《1》获取类的方式 《2》反射的应用 <1>获取类型的所有公共成员 <2>获取构造函数 <3>获取类型的 公共成员变量 <4>获取类型的 公共方法 <5>.获取类型的 属性 <6&g…...

深度学习核函数
一、核函数的基本概念 核函数在机器学习中具有重要应用价值,常用于支持向量机(SVM)等算法中。 核函数是面试中经常被考到的知识点,对于找工作和实际数据转换都有重要作用。 二、数据建模与核函数的作用 数据越多,可…...

Spring MVC流程一张图理解
由于现在项目中大部分都是使用springboot了,但是ssm中的springmvc还是可以了解一下 1 、用户发送请求至前端控制器 DispatcherServlet 。 2 、 DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。 3 、处理器映射器找到具体的处理器 ( 可以根据 xml 配…...

计算机网络速成
前言:最近在做一些动态的crypto,但是配置总搞不好,正好也有学web的想法,就先学学web再回去做密码,速成视频推荐b站建模老哥 目录 计算机网络概述网络的范围分级电路交换网络(电路交换)报文交换网…...

spring.profiles.active不同优先级
1、在editConfiguration中配置profiles.activedev会同时影响项目取application-dev.properties、bootstrap-dev.yaml,且这种方式优先级最高,会覆盖application.properties、bootstrap.yaml中的spring.profiles.active配置 2、在application.properties配…...

我这不需要保留本地修改, 只需要拉取远程更改
如果你不需要保留本地修改,只需要拉取远程更改并强制将本地分支与远程分支同步,可以按照以下步骤操作: 1. 丢弃本地修改 首先,丢弃所有本地未提交的修改: git reset --hard这会重置工作目录和暂存区,丢弃…...

源码编译安装httpd 2.4,提供系统服务管理脚本并测试(两种方法实现)
下载 httpd 2.4 源码: wget https://dlcdn.apache.org/httpd/httpd-2.4.x.tar.gztar -zxvf httpd-2.4.x.tar.gzcd httpd-2.4.x配置、编译和安装: ./configure --prefix/usr/local/apache2 --enable-so --enable-ssl --enable-cgi makesudo make install实…...

深度学习在自动化测试中的创新应用:提升运维效率与质量
《深度学习在自动化测试中的创新应用:提升运维效率与质量》 一、引言 在当今快速发展的软件行业中,自动化测试是确保软件质量和可靠性的关键环节。随着软件系统的日益复杂,传统的自动化测试方法在处理复杂场景、提高测试覆盖率和准确性方面面临着诸多挑战。深度学习作为人…...

单独编译QT子模块
单独编译QT子模块 系统 win qt-everywhere-src-5.12.12 下载源码: https://download.qt.io/archive/qt/5.12/5.12.12/single/ 参考: https://doc.qt.io/qt-5/windows-building.html 安装依赖 https://doc.qt.io/qt-5/windows-requirements.html Per…...

学习华为熵减:激发组织活力(系列之三)
目录 为什么学习华为? 学习华为什么? 一、势:顺势而为,在风口上猪都会飞起来。 二、道:就是认识和利用规律层面,文化和制度创新就是企业经营之道。 三、法:就是一套价值管理的变革方法论。…...

CNCF云原生计算基金会
CNCF,全称为云原生计算基金会(Cloud Native Computing Foundation),成立于2015年,是一个隶属于Linux基金会的非营利组织。CNCF旨在促进和支持开源技术的发展,特别是那些支持云原生(cloud native…...

STM32 FreeRTOS时间片调度---FreeRTOS任务相关API函数---FreeRTOS时间管理
目录 时间片调度简介 FreeRTOS任务相关API函数介绍 延时函数介绍 时间片调度简介 在FreeRTOS中,同等优先级的任务会轮流分享相同的CPU时间,这个时间被称为时间片。在这里,一个时间片的长度等同于SysTick中断的周期。 FreeRTOS任务相关API…...

SQL LAST()
SQL中的LAST()函数是一个用于返回指定列中最后一个记录值的函数。然而,需要注意的是,这个函数并不是SQL标准的一部分,因此并不是所有数据库系统都支持它。具体来说,只有MS Access直接支持LAST()函数【0†source】。 在其他数据库…...

云服务信息安全管理体系认证,守护云端安全
在数据驱动的时代,云计算已成为企业业务的超级引擎,推动着企业飞速发展。然而,随着云计算的广泛应用,信息安全问题也日益凸显,如同暗流涌动下的礁石,时刻威胁着企业的航行安全。这时,云服务信息…...

【Hive】新增字段(column)后,旧分区无法更新数据问题
TOC 【一】问题描述 Hive修改数据表结构的需求,比如:增加一个新字段。 如果使用如下语句新增列,可以成功添加列col1。但如果数据表tb已经有旧的分区(例如:dt20190101),则该旧分区中的col1将为…...

C# (图文教学)在C#的编译工具Visual Studio中使用SQLServer并对数据库中的表进行简单的增删改查--14
目录 一.安装SQLServer 二.在SQLServer中创建一个数据库 1.打开SQL Server Manager Studio(SSMS)连接服务器 2.创建新的数据库 3.创建表 三.Visual Studio 配置 1.创建一个简单的VS项目(本文创建为一个简单的控制台项目) 2.添加数据库连接 四.简单连通代码示例 简单连…...

4G DTU赋能智能配电环网柜通信运维管理
在智能电网建设持续推进下,智能配电环网柜作为配电网的关键节点设备,其稳定、高效运行对保障电力可靠供应是品质生活的基本保障。通信系统是实现智能配电环网柜远程监控与管理的核心纽带,而4G DTU(数据传输单元)凭借其…...

快速上手 HarmonyOS 应用开发
一、DevEco Studio 安装与配置 1. DevEco Studio 简介 DevEco Studio 是 HarmonyOS 的一站式集成开发环境(IDE),提供了丰富的工具和功能,支持 HarmonyOS 应用开发的全流程。 2. DevEco Studio 下载与安装 下载地址:…...

解决nginx: [emerg] unknown directive “stream“ in /etc/nginx/nginx.conf问题 --九五小庞
参考链接:https://blog.csdn.net/User_bie/article/details/128102168 Nginx在编译安装时,需指定安装的模块...