目录题目思路Code题目模拟一个系统的命令行配置包含添加、修改、删除三项操作详情如下:添加操作命令:add_rulerule_id1rule_index 18修改操作命令: mod_rule rule_id 1rule_index 100删除操作命令:del_rulerule_id1其中: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_id1 rule_index9999][mod_rule rule_id1 rule_index10][del rule rule_id1]输出1说明[add_rule rule_id1 rule_index9999]成功[mod_rule rule_id1 rule_index10]成功[del rule rule_id1]操作关键字是del不合法 → 失败1次输出1。思路虽然逻辑比较长但是整体逻辑还是比较简单的解析命令用正则或字符串分割提取[...]中的每条命令校验关键字操作关键字必须是add_rule/mod_rule/del_rule属性关键字必须是rule_id/rule_index校验取值rule_id和rule_index必须是 1~9999 的整数执行逻辑add_rule需要rule_idrule_indexid 不存在才成功mod_rule需要rule_idrule_indexid 必须存在且 index 有变化才成功del_rule需要rule_idid 必须存在才成功统计失败次数Codeimport 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(^\|\$, ); // 提取每条命令方括号内的内容 ListString cmds new ArrayList(); Matcher m Pattern.compile(\\[([^\\]]*)\\]).matcher(s); while (m.find()) cmds.add(m.group(1)); MapInteger, 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]; // 解析属性键值对 MapString, 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_indexid必须存在且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_idid必须存在 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(MapString, 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; } } }Gopackage 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_indexid必须存在且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_idid必须存在 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机试真题PythonJSJavaGo合集】【超值优惠】Py/JS/Java/Go合集【华为od机试真题Python】Python真题题库【华为od机试真题JavaScript】JavaScript真题题库【华为od机试真题JavaGo】JavaGo真题题库【华为od机试真题C】C真题题库【华为od机试真题C语言】C语言真题题库【华为od面试手撕代码题库】面试手撕代码题库【华为od机试面试交流群830285880】【文章底部有二维码链接可扫码加交流群】华为OD机试:二本院校有机会吗?有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。