目录
题目
模拟一个系统的命令行配置,包含添加、修改、删除三项操作,详情如下:
添加操作命令: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。
思路
虽然逻辑比较长,但是整体逻辑还是比较简单的:
- 解析命令:用正则或字符串分割提取
[...]中的每条命令- 校验关键字:操作关键字必须是
add_rule/mod_rule/del_rule,属性关键字必须是rule_id/rule_index- 校验取值:
rule_id和rule_index必须是 1~9999 的整数- 执行逻辑:
add_rule:需要rule_id+rule_index,id 不存在才成功mod_rule:需要rule_id+rule_index,id 必须存在且 index 有变化才成功del_rule:需要rule_id,id 必须存在才成功- 统计失败次数
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。让他帮助你查询原因。



1922

被折叠的 条评论
为什么被折叠?



