华为OD机试真题 新系统 2026-05-24 JavaGoC 实现【简单表达式计算】

华为OD机试真题 新系统 2026-05-24 JavaGoC 实现【简单表达式计算】 目录题目思路Code题目题目内容给出一个由字母数字和加减运算符组成的简单表达式做如下处理1.对字符串进行解析获取8进数(0o或0O开头)10进制16进数(0x或0X开头)整数和加减 - 运算符;2.对解析结果按照表达式的顺序从左到右进行运算得到10进制整数结果3.把运算的结果调整到-255-255范围如果值大于255取值255如果值小-255取-255;4.把调整后的结果转换成十六进制开进行取反运算5.输出最终运算结果对应的字特串。输入描述string inputStr表达式输出描述strimngoutputSt 返回 NA 或者运算结果对应的字符串1.给定的iputStr是由字母、数字、、- 组成的字符串长度为0-10000;2.关于(iputStr中解析的整数部分表示进制的x、o以及数值部分的字母a-f支持大小写支持前缀为0整数串解析的整数查范围为0-999例如:0xEF、0X0eF、0X00Ef、0X000Ef、0x0000EF、0x00000ef 等解析的整数16进制为0xEF,10进制值为239;“89、“089、“0089、“00089”、“000089、0000089等解析的整数10进制值为89;。“0o77、“00077”、“000077、“00000077、“000000077°等解析的整数8进制值为0077,10进制值为63;。如果输入表达式合法则输出最终十六进制运算结果对应的字符串;否则输出NA例如:包含非法字符、长度超出范围、表达式不合法、值超出范围、输入有负数等;输出的十六进制字符串以“0x为前缀数值字符用大写补齐两位例如:“0x00”、“0x0B”、“0xC9、“0x2E”、“0xDF, 0x3A样例1输入0230x210o131输出0xBB说明计算结果为68转换16进制为44取反后16进制结果为BB样例2输入0x0C-0o201输出0x02说明计算结果为-3。该负数的16进物码值为FFFFFFFD.取反后16进制值为0x22样例3输入-15输出NA说明非法表达式不支持负数思路逻辑模拟思路分析从左到右解析表达式识别数字十进制、0x/0X 十六进制、0o/0O 八进制和 - 运算符逐个计算累计结果将结果调整到 [-255, 255]对 8-bit 值做按位取反 (~val 0xFF)格式化为0x 2位大写十六进制输出非法输入返回NACodeimport java.util.Scanner; public class solution { /* * 全局变量 * expr - 从标准输入读取的表达式字符串 * n - 表达式总长度 * pos - 当前解析下标所有解析函数共享逐步向前移动 */ static String expr; static int n, pos; /* * 程序入口读取一行表达式计算结果并输出 */ public static void main(String[] args) { // 从标准输入读取一行表达式并去除首尾空白 Scanner sc new Scanner(System.in); expr sc.nextLine().trim(); sc.close(); // 输出计算结果 System.out.println(solve()); } /** * 主求解函数 * * 处理步骤 * 1. 从左到右解析数字与 - 运算符 * 2. 顺序求值得到十进制结果 * 3. 将结果钳位到 [-255, 255] 区间 * 4. 对结果的低 8 位做按位取反~ * 5. 格式化为 0x 2 位大写十六进制字符串 * * return 合法时返回格式字符串非法时返回 NA */ static String solve() { // ----- 前置合法性检查 ----- // 空字符串或长度超过 10000 都属于非法输入 if (expr.isEmpty() || expr.length() 10000) return NA; n expr.length(); pos 0; // 重置解析位置到开头 // 表达式不能以 或 - 开头题目规定不支持负数-15 返回 NA if (-.indexOf(expr.charAt(0)) ! -1) return NA; // ----- 解析第一个数字 ----- Integer val parseNum(); if (val null) return NA; // 第一个数字解析失败 // ----- 循环解析运算符 数字 ----- while (pos n) { // 当前位置必须是运算符 或 - if (pos n || -.indexOf(expr.charAt(pos)) -1) return NA; char op expr.charAt(pos); // 记录运算符 pos; // 跳过运算符字符 // 解析运算符后面的数字 Integer num parseNum(); if (num null) return NA; // 数字解析失败 // 根据运算符做加减法注意只有 和 - if (op ) val num; else val - num; } // 确保整个表达式的字符都被消费完毕没有多余字符残留 if (pos ! n) return NA; // ----- 结果钳位到 [-255, 255] ----- if (val 255) val 255; else if (val -255) val -255; // ----- 低 8 位按位取反并格式化为 2 位大写十六进制 ----- int val8bit val 0xFF; // 取低 8 位Java 中负数自动转补码 int result (~val8bit) 0xFF; // 按位取反后再 0xFF 只保留 8 位 return String.format(0x%02X, result); // 0x 2位大写不足补0 } /** * 从全局变量 pos 指向的位置开始解析一个整数。 * * 支持的格式按优先级 * 1. 0x/0X 前缀 - 十六进制a-f/A-F 均可 * 2. 0o/0O 前缀 - 八进制仅 0-7 * 3. 无前缀或前导零 - 十进制含前导零如 089 89 * * 每个数字的数值必须在 0 ~ 999 之间超限则判为非法。 * * return 解析成功返回 Integer 数值失败返回 null */ static Integer parseNum() { // 已经到达字符串末尾无数字可解析 if (pos n) return null; char c expr.charAt(pos); /* * 检查是否是 0x/0o 这样的进制前缀。 * 条件是当前字符为 0且后面至少还有一个字符。 */ if (c 0 pos 1 n) { char next expr.charAt(pos 1); // 十六进制分支 if (next x || next X) { int j pos 2; // 跳过 0xj指向第一个数值字符 // 第一个数值字符必须是合法十六进制数字 if (j n || !isHexDigit(expr.charAt(j))) return null; // 向后连续扫描所有十六进制数字 while (j n isHexDigit(expr.charAt(j))) j; try { // 用 Integer.parseInt 按 16 进制解析子串 int val Integer.parseInt(expr.substring(pos 2, j), 16); if (val 999) return null; // 超出题目规定的数值范围 pos j; // 更新全局解析位置 return val; } catch (NumberFormatException e) { return null; // parse 异常防御性保留 } } // 八进制分支 else if (next o || next O) { int j pos 2; // 跳过 0o if (j n || !isOctDigit(expr.charAt(j))) return null; while (j n isOctDigit(expr.charAt(j))) j; try { int val Integer.parseInt(expr.substring(pos 2, j), 8); if (val 999) return null; pos j; return val; } catch (NumberFormatException e) { return null; } } // 注意如果 0 后面跟的不是 x/X/o/O则 fallthrough 到十进制分支 } // 十进制分支 // 第一个字符必须为数字字符 0-9 if (!Character.isDigit(c)) return null; int j pos; // 向后扫描所有连续的数字字符 while (j n Character.isDigit(expr.charAt(j))) j; try { int val Integer.parseInt(expr.substring(pos, j)); // 按 10 进制解析 if (val 999) return null; pos j; return val; } catch (NumberFormatException e) { return null; } } /* * 判断字符 c 是否为合法的十六进制数字。 * 合法集合0-9a-fA-F */ static boolean isHexDigit(char c) { return (c 0 c 9) || (c a c f) || (c A c F); } /* * 判断字符 c 是否为合法的八进制数字。 * 合法集合0-7 */ static boolean isOctDigit(char c) { return c 0 c 7; } }Gopackage main import ( bufio fmt os strconv strings ) var expr string // 输入表达式 var n, pos int // 总长度、当前解析位置 // isHexDigit 判断字符是否为合法的十六进制数字(0-9, a-f, A-F) func isHexDigit(c byte) bool { return (c 0 c 9) || (c a c f) || (c A c F) } // isOctDigit 判断字符是否为合法的八进制数字(0-7) func isOctDigit(c byte) bool { return c 0 c 7 } // parseNum 从当前位置解析一个数字 // 支持: 十进制, 0x/0X十六进制, 0o/0O八进制 // 返回 (数值, 是否成功) func parseNum() (int, bool) { if pos n { return 0, false } // 检查是否为十六进制/八进制前缀 if expr[pos] 0 pos1 n { // --- 十六进制: 0x 或 0X --- if expr[pos1] x || expr[pos1] X { j : pos 2 // 0x后面必须有至少一个十六进制数字 if j n || !isHexDigit(expr[j]) { return 0, false } for j n isHexDigit(expr[j]) { j } val, err : strconv.ParseInt(expr[pos2:j], 16, 64) if err ! nil || val 999 { // 数值必须在0~999 return 0, false } pos j return int(val), true } // --- 八进制: 0o 或 0O --- if expr[pos1] o || expr[pos1] O { j : pos 2 if j n || !isOctDigit(expr[j]) { return 0, false } for j n isOctDigit(expr[j]) { j } val, err : strconv.ParseInt(expr[pos2:j], 8, 64) if err ! nil || val 999 { return 0, false } pos j return int(val), true } } // --- 十进制支持前导零 --- if expr[pos] 0 || expr[pos] 9 { return 0, false } j : pos for j n expr[j] 0 expr[j] 9 { j } val, err : strconv.Atoi(expr[pos:j]) if err ! nil || val 999 { return 0, false } pos j return val, true } // solve 主求解函数 // 步骤: // // 1. 解析数字(十进制/0x十六进制/0o八进制)与-运算符 // 2. 从左到右计算 // 3. 结果钳位到[-255, 255] // 4. 对8-bit值按位取反 // 5. 格式化为0x 2位大写十六进制 func solve() string { // 空字符串或超长 → 非法 if len(expr) 0 || len(expr) 10000 { return NA } n len(expr) pos 0 // 表达式不能以 或 - 开头 if expr[0] || expr[0] - { return NA } // 解析第一个数字 val, ok : parseNum() if !ok { return NA } // 循环解析: 运算符 数字 for pos n { if pos n || (expr[pos] ! expr[pos] ! -) { return NA } op : expr[pos] pos num, ok : parseNum() if !ok { return NA } if op { val num } else { val - num } } // 确保整个表达式被消费完毕 if pos ! n { return NA } // 钳位到[-255,255] if val 255 { val 255 } else if val -255 { val -255 } // 取8-bit值并按位取反 val8bit : val 0xFF result : (^val8bit) 0xFF return fmt.Sprintf(0x%02X, result) } func main() { // 从标准输入读取一行表达式 scanner : bufio.NewScanner(os.Stdin) if scanner.Scan() { expr strings.TrimSpace(scanner.Text()) fmt.Println(solve()) } }C#include stdio.h #include string.h #include ctype.h #include stdlib.h char expr[10005]; // 输入表达式最大长度10000终止符 int n, pos; // 总长度、当前解析位置 /** * 判断字符是否为合法的十六进制数字(0-9, a-f, A-F) */ int isHexDigit(char c) { return isdigit(c) || (c a c f) || (c A c F); } /** * 判断字符是否为合法的八进制数字(0-7) */ int isOctDigit(char c) { return c 0 c 7; } /** * 从当前位置解析一个数字 * 支持: 十进制, 0x/0X十六进制, 0o/0O八进制 * 返回值: 1成功, 0失败; 数值通过val指针返回 */ int parseNum(int *val) { if (pos n) return 0; // 检查是否为十六进制/八进制前缀 if (expr[pos] 0 pos 1 n) { // --- 十六进制: 0x 或 0X --- if (expr[pos 1] x || expr[pos 1] X) { int j pos 2; // 0x后面必须有至少一个十六进制数字 if (j n || !isHexDigit(expr[j])) return 0; while (j n isHexDigit(expr[j])) j; char sub[50]; int len j - pos - 2; strncpy(sub, expr pos 2, len); sub[len] \0; *val (int)strtol(sub, NULL, 16); if (*val 999) return 0; // 每个数字的值必须在0~999 pos j; return 1; } // --- 八进制: 0o 或 0O --- else if (expr[pos 1] o || expr[pos 1] O) { int j pos 2; if (j n || !isOctDigit(expr[j])) return 0; while (j n isOctDigit(expr[j])) j; char sub[50]; int len j - pos - 2; strncpy(sub, expr pos 2, len); sub[len] \0; *val (int)strtol(sub, NULL, 8); if (*val 999) return 0; pos j; return 1; } } // --- 十进制支持前导零 --- if (!isdigit(expr[pos])) return 0; int j pos; while (j n isdigit(expr[j])) j; char sub[50]; int len j - pos; strncpy(sub, expr pos, len); sub[len] \0; *val atoi(sub); if (*val 999) return 0; pos j; return 1; } /** * 主求解函数 * 步骤: * 1. 解析数字与-运算符 * 2. 从左到右计算 * 3. 结果钳位到[-255, 255] * 4. 对8-bit值按位取反 * 5. 格式化为0x 2位大写十六进制 */ char* solve() { static char res[16]; // 存储结果字符串(如0xBB) // 空字符串或超长 → 非法 if (strlen(expr) 0 || strlen(expr) 10000) { strcpy(res, NA); return res; } n strlen(expr); pos 0; // 表达式不能以或-开头 if (expr[0] || expr[0] -) { strcpy(res, NA); return res; } // 解析第一个数字 int val; if (!parseNum(val)) { strcpy(res, NA); return res; } // 循环解析: 运算符 数字 while (pos n) { if (pos n || (expr[pos] ! expr[pos] ! -)) { strcpy(res, NA); return res; } char op expr[pos]; pos; int num; if (!parseNum(num)) { strcpy(res, NA); return res; } if (op ) val num; else val - num; } // 确保整个表达式被消费完毕 if (pos ! n) { strcpy(res, NA); return res; } // 钳位到[-255,255] if (val 255) val 255; else if (val -255) val -255; // 取8-bit值并按位取反 int val8bit val 0xFF; int result (~val8bit) 0xFF; sprintf(res, 0x%02X, result); return res; } int main() { // 从标准输入读取一行表达式 if (fgets(expr, sizeof(expr), stdin)) { int len strlen(expr); if (len 0 expr[len - 1] \n) expr[len - 1] \0; printf(%s\n, solve()); } return 0; }【华为od机试真题PythonJSJavaGo合集】【超值优惠】Py/JS/Java/Go合集【华为od机试真题Python】Python真题题库【华为od机试真题JavaScript】JavaScript真题题库【华为od机试真题JavaGo】JavaGo真题题库【华为od机试真题C】C真题题库【华为od机试真题C语言】C语言真题题库【华为od面试手撕代码题库】面试手撕代码题库【华为od机试面试交流群】【文章底部有二维码链接可扫码加交流群】华为OD机试:二本院校有机会吗?有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。