第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…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...