5.24华为OD机试真题 新系统 – 简单表达式运算 (JavaPyCC++JsGo)

  • 简单表达式运算

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

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

    题目描述

    给出一个由字母、数字和加减运算符组成的简单表达式,做如下处理:

    1、对字符串进行解析,获取 8 进制( 0o 或 0O 开头)、10 进制、16 进制( 0x 或 0X 开头)整数和 +、− 运算符;

    2、对解析结果,按照表达式的顺序从左到右进行运算,得到 10 进制整数结果;

    3、把运算的整数结果调整到 −255\~255 范围,如果值大于 255,则取值 255,如果值小于 −255,则取 −255;

    4、把调整后的结果转换成十六进制并进行取反运算;

    5、输出最终运算结果对应的字符串。

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

    输入描述

    string inputStr // 表达式

    输出描述

    string outputStr // 返回 "NA" 或者运算结果对应的字符串

    注: 1、给定的 inputStr 是由字母、数字、+、− 组成的字符串,长度为 0\~10000;

    2、关于 inputStr 中解析的整数部分,表示进制的 x、o 以及数值部分的字母 a \~ f 支持大小写,支持前缀为 0 整数串,解析的整数值范围为 0\~999,例如:

    • (1) "0xEF"、"0X0eF"、"0X00Ef"、"0X000EF"、"0x0000EF"、"0x00000ef"等解析的整数 16 进制值为 0xEF,10 进制值为 239;

    • (2) "89"、"089"、"0089"、"00089"、"000089"、"0000089"等解析的整数 10 进制值为 89;

    • (3) "0o77"、"0O077"、"0O0077"、"0O000077"、"0o0000077" 等解析的整数 8 进制值为 0o77,10 进制值为 63;

    3、如果输入表达式合法,则输出最终十六进制运算结果对应的字符串;否则输出 NA,例如:包含非法字符、长度超出范围、表达式不合法、值超出范围、输入有负数等;

    4、输出的十六进制字符串以 "0x" 为前缀,数值字符用大写,补齐两位,例如:"0x00"、"0x0B"、"0xC9"、"0x2E"、"0xDF"、"0x3A"。

    补充说明:

    1、程序运行内存要小于 256 MB;

    2、程序运行耗时不能超过 1 秒。

    示例1

    输入

    023+0x21+0o13+1

    输出

    0xBB

    说明

    计算结果为 68,转换 16 进制为 44,取反后 16 进制结果为 BB

    示例2

    输入

    0x0C-0o20+1

    输出

    0x02

    说明

    计算结果为 $$-3$$,该负数的 16 进制补码值为 FFFFFFFD,取反后 16 进制值为 0x2

    示例3

    输入

    -1+5

    输出

    NA

    说明

    非法表达式,不支持负数

    示例4

    输入

    2324+12-23

    输出

    NA

    说明

    表达式中整数超过限定范围

    示例5

    输入

    123 + 12-13=

    输出

    NA

    说明

    表达式中存在非法的空白字符

    示例6

    输入

    3A+0xEGW-0o89

    输出

    NA

    说明

    表达式不合法,10 进制、16 进制、8 进制的数都不正确

    示例7

    输入

    45-46

    输出

    0x00

    说明

    计算结果为 −1,该负数的补码为 FFFFFFFF,取反后为 0

    示例8

    输入

    30+0xEc+0O12+9

    输出

    0x00

    说明

    输出结果为 285,大于 255,取值 255,16 进制为 0xFF,取反后的 16 进制结果为 0x00

    解题思路

    本题分为四个阶段:合法性检查数制解析表达式求值取反输出

    阶段一:合法性检查

    • 长度 ≤ 10000
    • 字符集:仅字母、数字、+、-
    • 不能以 - 开头(避免与负数混淆)

    阶段二:数制解析

    • 前缀 0x / 0X → 十六进制(字符 0-9, a-f, A-F)
    • 前缀 0o / 0O → 八进制(字符 0-7)
    • 无前缀 → 十进制(字符 0-9)
    • 每个解析出的整数必须 ≤ 999

    阶段三:表达式求值

    • 从左到右顺序加减运算

    阶段四:结果处理

    • clamp 到 [-255, 255]
    • 按位取反:~result & 0xFF(得到 0\~255 的 8 位值)
    • 格式化为 0x + 大写两位十六进制

    复杂度分析

    • 时间: O(n),每个字符常数次访问
    • 空间:
THE END