**查找能被整除的最大整数**
2026 华为OD机试真题 5月13日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
给定一个字符串和一个正整数,字符串由大小写字母和数字组成,要求从字符串中找出最大能被给定正整数整除的数。
输入描述
- string inputStr // 第一个字符串
- int inputDivisor // 第二个正整数
输出描述
result // 返回结果值
注:
-
给定的 inputStr 字符串长度为 1~ 10000,给定的 inputDivisor 值的范围为 1~ 99;
-
从 inputStr 中解析的整数不可分割,支持前缀为 0 整数串,数值范围为 0~ 999,例如:
(1) "29ab03"、"29ab003"、"29ab0003"、"29ab00003"、"29ab000003"等 3 前面有前缀 0 的数字串,解析出整数为 29 和 3;
(2) "0abc123"、"00abc123"、"000abc123"、"0000abc123"、"00000abc123" 等含一个或多个 0 的数字串,解析出整数为 0 和 123。
-
如果输入都合法且能找到能被整除的最大数,则输出该最大数; 其他情况输出 −1,例如: (1) 输入数据包含非法字符、值超出范围、长度超出范围等; (2) 没有找到能被 inputDivisor 整除的数。
补充说明
- 程序运行内存要小于256MB;
- 程序运行耗时不能超过 1 秒。
示例1
输入
abc123EFEDG34aadD78er,2
输出
78
说明
34 和 78 都能被 2 整除,78 为能被整除的最大数。
示例2
输入
wrwqr1.0we+de-,3
输出
-1
说明
参数 1 字符串中包含非法字符 .+−
示例3
输入
ewr23hk064ASW12VBG,4
输出
64
说明
获取的整数列表为 23、64、12,能被 4 整除的最大数为 64
示例4
输入
ewr23hk064ASW12VBG,5
输出
-1
说明
获取的整数列表为 23、64、12,都不能被5整除
示例5
输入
wrq45ret0eww237ere,7
输出
说明
只有 0 能被 7 整除
示例6
输入
aaa2222bb66,2
输出
-1
说明
第一个参数中存在大于 999 的整数,参数不合法。
解题思路
本题要求从一个包含字母和数字的字符串中,提取出所有的整数(支持前导零),并找出其中能被给定正整数整除的最大整数。
-
参数校验:
- 字符串长度需在 1 到 10000 之间。
- 除数范围在 1 到 99 之间。
- 字符串只能由大小写字母和数字组成。如果出现其他字符(如
.、+、-等),视为非法输入,直接输出 -1。
-
整数提取规则:
- 连续的数字字符构成一个整数。
- 提取出的整数数值范围为 0 到 999。
- 如果连续数字串的有效数值超过 999(即忽略前导零后的位数超过 3 位,或者数值大于 999),则参数不合法,输出 -1。
- 特殊情况处理:全为 0 的数字串(如
、00、000)解析结果为数值 0。
-
算法流程:
- 遍历字符串,使用一个指针(或状态机)识别连续的数字片段。
- 对于每一段数字片段:
- 过滤掉前导零。
- 统计有效数字的长度并计算数值。
- 校验数值是否超过 999。
- 若校验通过,判断该数值是否能被除数整除,并维护全局最大值。
- 最后输出最大值,若未找到满足条件的数,则输出 -1。
复杂度分析
- 时间复杂度:$O(N)$,其中 $N$ 是字符串的长度。我们只需要对字符串进行一次线性扫描。
- 空间复杂度:$O(1)$,除了存储输入的字符串外,只需要常数级别的额外空间来记录当前的数字和最大值。