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),每个字符常数次访问
- 空间:
-