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

目录

题目

思路

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_id 和 rule_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。让他帮助你查询原因。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MISAYAONE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值