**查找能被整除的最大整数**

2026 华为OD机试真题 5月13日华为OD上机新系统考试真题 100 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

题目描述

给定一个字符串和一个正整数,字符串由大小写字母和数字组成,要求从字符串中找出最大能被给定正整数整除的数。

输入描述

  • string inputStr // 第一个字符串
  • int inputDivisor // 第二个正整数

输出描述

result // 返回结果值

:

  1. 给定的 inputStr 字符串长度为 1~ 10000,给定的 inputDivisor 值的范围为 1~ 99;

  2. 从 inputStr 中解析的整数不可分割,支持前缀为 0 整数串,数值范围为 0~ 999,例如:

    (1) "29ab03"、"29ab003"、"29ab0003"、"29ab00003"、"29ab000003"等 3 前面有前缀 0 的数字串,解析出整数为 29 和 3;

    (2) "0abc123"、"00abc123"、"000abc123"、"0000abc123"、"00000abc123" 等含一个或多个 0 的数字串,解析出整数为 0 和 123。

  3. 如果输入都合法且能找到能被整除的最大数,则输出该最大数; 其他情况输出 −1,例如: (1) 输入数据包含非法字符、值超出范围、长度超出范围等; (2) 没有找到能被 inputDivisor 整除的数。

补充说明

  1. 程序运行内存要小于256MB;
  2. 程序运行耗时不能超过 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. 参数校验

    • 字符串长度需在 1 到 10000 之间。
    • 除数范围在 1 到 99 之间。
    • 字符串只能由大小写字母和数字组成。如果出现其他字符(如 .+- 等),视为非法输入,直接输出 -1。
  2. 整数提取规则

    • 连续的数字字符构成一个整数。
    • 提取出的整数数值范围为 0 到 999。
    • 如果连续数字串的有效数值超过 999(即忽略前导零后的位数超过 3 位,或者数值大于 999),则参数不合法,输出 -1。
    • 特殊情况处理:全为 0 的数字串(如 00000)解析结果为数值 0。
  3. 算法流程

    • 遍历字符串,使用一个指针(或状态机)识别连续的数字片段。
    • 对于每一段数字片段:
      • 过滤掉前导零。
      • 统计有效数字的长度并计算数值。
      • 校验数值是否超过 999。
      • 若校验通过,判断该数值是否能被除数整除,并维护全局最大值。
    • 最后输出最大值,若未找到满足条件的数,则输出 -1。

复杂度分析

  • 时间复杂度:$O(N)$,其中 $N$ 是字符串的长度。我们只需要对字符串进行一次线性扫描。
  • 空间复杂度:$O(1)$,除了存储输入的字符串外,只需要常数级别的额外空间来记录当前的数字和最大值。
THE END