当前位置: 首页 > news >正文

华为OD机试真题 新系统2026-04-08 JavaGo 实现【配置操作失败数量统计】

目录

题目

思路

Code


题目

模拟一个系统的命令行配置,包含添加、修改、删除三项操作,详情如下:
添加操作命令:add_rulerule_id=1rule_index = 18
修改操作命令: mod_rule rule_id= 1rule_index = 100
删除操作命令:del_rulerule_id=1
其中:add_rule、mod_rule、 del_rule 是操作关键字,rule_id、 rule_index 是属性关键字且属性取值范围为数字1-9999之间,操作、属性之间都用空格进行分割。
1.在进行所有操作时,如果缺少关键字,或者相应的rule_id、rule_index的取值不符合要求,则操作失败。
2.在进行添加操作时,参数必须包含rule_id和rule_indea,如果添加的rule_id当前不存在,则添加成功,如果添加已经存在的rule_id,则操作失败。
3.在进行修改操作时,参数必须包含rule_id和rule_inder,如果当前rule_id 不存在,或前后rule_index没有变化,则操作失败。
4.在进行删除操作时,参数必须包含rule_id,如果当前rule_id不存在,则操作失败。在进行批量操作时,一个命令失败后可以继续下一条命令的操作。现给有一组批量操作的字符串,包括不超过1000条连续的操作指令,格式为[cmd][cmd][cmd],请将字符串解析后按照顺序进入你实现的系统,统计出配置失败的次数。

输入描述:

一个字符串,格式为[cmd][cmd][cmd],表示批量操作。最多不超过1000条连续的操作指令。

输出描述:

输出一个整数,表示统计出配置失败的次数。
示例1
输入
[add_rule rule_id=1 rule_index=9999][mod_rule rule_id=1 rule_index=10][del rule rule_id=1]

输出:

1

说明:

[add_rule rule_id=1 rule_index=9999]成功,[mod_rule rule_id=1 rule_index=10]成功,[del rule rule_id=1]操作关键字是del不合法 → 失败1次,输出1

思路

虽然逻辑比较长,但是整体逻辑还是比较简单的:

  1. 解析命令:用正则或字符串分割提取[...]中的每条命令
  2. 校验关键字:操作关键字必须是add_rule/mod_rule/del_rule,属性关键字必须是rule_id/rule_index
  3. 校验取值:rule_idrule_index必须是 1~9999 的整数
  4. 执行逻辑:
    • add_rule:需要rule_id+rule_index,id 不存在才成功
    • mod_rule:需要rule_id+rule_index,id 必须存在且 index 有变化才成功
    • del_rule:需要rule_id,id 必须存在才成功
  5. 统计失败次数

Code

import java.util.*; import java.util.regex.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine().trim().replaceAll("^\"|\"$", ""); // 提取每条命令(方括号内的内容) List<String> cmds = new ArrayList<>(); Matcher m = Pattern.compile("\\[([^\\]]*)\\]").matcher(s); while (m.find()) cmds.add(m.group(1)); Map<Integer, Integer> rules = new HashMap<>(); int fail = 0; for (String cmd : cmds) { String[] parts = cmd.trim().split("\\s+"); if (parts.length == 0) { fail++; continue; } String op = parts[0]; // 解析属性键值对 Map<String, String> attrs = new HashMap<>(); boolean valid = true; for (int i = 1; i < parts.length; i++) { String[] kv = parts[i].split("="); if (kv.length != 2) { valid = false; break; } attrs.put(kv[0], kv[1]); } if (!valid) { fail++; continue; } // 校验取值是否为1-9999的整数 if (op.equals("add_rule")) { // 必须包含rule_id和rule_index,且取值合法,且id不存在 if (!checkVal(attrs, "rule_id") || !checkVal(attrs, "rule_index")) { fail++; } else if (rules.containsKey(Integer.parseInt(attrs.get("rule_id")))) { fail++; } else { rules.put(Integer.parseInt(attrs.get("rule_id")), Integer.parseInt(attrs.get("rule_index"))); } } else if (op.equals("mod_rule")) { // 必须包含rule_id和rule_index,id必须存在,且index有变化 if (!checkVal(attrs, "rule_id") || !checkVal(attrs, "rule_index")) { fail++; } else { int id = Integer.parseInt(attrs.get("rule_id")); int idx = Integer.parseInt(attrs.get("rule_index")); if (!rules.containsKey(id) || rules.get(id) == idx) { fail++; } else { rules.put(id, idx); } } } else if (op.equals("del_rule")) { // 必须包含rule_id,id必须存在 if (!checkVal(attrs, "rule_id")) { fail++; } else { int id = Integer.parseInt(attrs.get("rule_id")); if (!rules.containsKey(id)) { fail++; } else { rules.remove(id); } } } else { fail++; } } System.out.println(fail); } static boolean checkVal(Map<String, String> attrs, String key) { if (!attrs.containsKey(key)) return false; String v = attrs.get(key); try { int num = Integer.parseInt(v); return num >= 1 && num <= 9999; } catch (Exception e) { return false; } } }

Go

package main import ( "bufio" "fmt" "os" "regexp" "strconv" "strings" ) func checkVal(attrs map[string]string, key string) (int, bool) { v, ok := attrs[key] if !ok { return 0, false } num, err := strconv.Atoi(v) if err != nil || num < 1 || num > 9999 { return 0, false } return num, true } func main() { reader := bufio.NewReader(os.Stdin) s, _ := reader.ReadString('\n') s = strings.TrimSpace(s) s = strings.Trim(s, "\"") // 提取每条命令(方括号内的内容) re := regexp.MustCompile(`\[([^\]]*)\]`) matches := re.FindAllStringSubmatch(s, -1) rules := make(map[int]int) fail := 0 for _, m := range matches { parts := strings.Fields(m[1]) if len(parts) == 0 { fail++ continue } op := parts[0] // 解析属性键值对 attrs := make(map[string]string) valid := true for _, p := range parts[1:] { kv := strings.SplitN(p, "=", 2) if len(kv) != 2 { valid = false break } attrs[kv[0]] = kv[1] } if !valid { fail++ continue } switch op { case "add_rule": // 必须包含rule_id和rule_index,且取值合法,且id不存在 id, ok1 := checkVal(attrs, "rule_id") idx, ok2 := checkVal(attrs, "rule_index") if !ok1 || !ok2 { fail++ } else if _, exists := rules[id]; exists { fail++ } else { rules[id] = idx } case "mod_rule": // 必须包含rule_id和rule_index,id必须存在,且index有变化 id, ok1 := checkVal(attrs, "rule_id") idx, ok2 := checkVal(attrs, "rule_index") if !ok1 || !ok2 { fail++ } else if old, exists := rules[id]; !exists || old == idx { fail++ } else { rules[id] = idx } case "del_rule": // 必须包含rule_id,id必须存在 id, ok1 := checkVal(attrs, "rule_id") if !ok1 { fail++ } else if _, exists := rules[id]; !exists { fail++ } else { delete(rules, id) } default: fail++ } } fmt.Println(fail) }

【华为od机试真题Python+JS+Java+Go合集】【超值优惠】:Py/JS/Java/Go合集

【华为od机试真题Python】:Python真题题库

【华为od机试真题JavaScript】:JavaScript真题题库

【华为od机试真题Java&Go】:Java&Go真题题库

【华为od机试真题C++】:C++真题题库

【华为od机试真题C语言】:C语言真题题库

【华为od面试手撕代码题库】:面试手撕代码题库

【华为od机试面试交流群:830285880】【文章底部有二维码链接,可扫码加交流群】

华为OD机试:二本院校有机会吗?
有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。

http://www.cnnetsun.cn/news/1815101.html

相关文章:

  • STM32H7 SPI4与W25Q128 Flash通信实战:50MHz时钟配置避坑指南
  • 自动驾驶规划控制入门:为什么低速场景下必须用运动学模型?
  • C#批量生成带Logo的二维码?我写了个小工具解放双手(Free Spire.Barcode实战)
  • 10分钟掌握Kubernetes核心操作:kubectl命令速查指南
  • 【亲测免费】 element中Notification组件(this.$notify)自定义样式示例
  • 深入解析 Chromium 中的 Mojo IPC 消息机制及其实现
  • 多尺度特征融合在计算机视觉中的实践与优化
  • 如何有效实施styleguide41/styleguide:团队协作与代码规范的最佳实践
  • 体系结构论文(103):AKG Kernel Agent: A Multi-Agent Framework for Cross-Platform Kernel Synthesis
  • 若依前后端分离系统生产环境部署实战指南
  • 终极指南:彻底解决Catppuccin Tmux主题的字体缓存问题
  • EasyVtuber终极面捕输入配置:iFacialMocap vs OpenSeeFace对比评测
  • rasterizeHTML.js 终极指南:跨浏览器HTML到Canvas渲染完整教程
  • Java字符串相似度计算:10大算法库终极指南
  • Flutter Riverpod 2.5.1 保姆级避坑指南:从购物车实战到异步状态刷新,手把手教你避开那些文档里没写的坑
  • 智能家居中枢:OpenClaw+gemma-3-12b-it解析自然语言控制指令
  • DSI3协议实战入门:从理论到波形调试的完整指南
  • Cursor AI伴侣配置避坑指南:DeepSeek官方API vs 硅基流动,哪个更适合你?
  • 别再只调参了!深入对比改进A*与DWA融合前后,你的机器人路径规划效果差在哪?
  • 避坑指南:解决Xcode中‘multiple commands produce PrivacyInfo.xcprivacy’编译错误
  • prompt技巧:如何让AI写出我想要的风格的verilog代码?
  • 自动驾驶多传感器融合第一步:手把手教你标定激光雷达与摄像头(附代码思路)
  • cv_unet_image-colorization步骤详解:上传→分析→上色→对比,全流程可视化操作
  • 毕业设计论文写作指导——本科软件系统实现类
  • 告别串口助手!用VOFA+和STM32的DMA串口实现高刷波形监控(附完整工程)
  • 机械识图:第一角投影
  • OpenClaw备份方案:Phi-3-mini自动归档重要文件
  • OpenClaw人人养虾:对话模式
  • OpenClaw人人养虾:iOS Node App
  • 2026年公文降AI工具哪个好?职场人实测3款告诉你选哪个