201612-3 权限查询

前面几行的权限信息我直接跳过没有用,因为题目已经保证了输入的合法性。(其实这么做的时候,我还是有点心慌的,因为有一次参赛的时候,使用了自以为高明的方法结果只拿了10分🌚)

使用HashMap<UserName, HashMap<PrivilegeName, Integer>>来存储用户及其权限信息,使用同样的结构来存储角色信息。存储时都要注意,同样的权限多次出现时要对比等级。

另:我觉得这份代码写得不好看,欢迎大家多多批评指正我。

奉上耗时700ms的java满分代码

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        {
            int n = Integer.parseInt(scanner.nextLine());
            for (int i = 0; i < n; i++) {
                scanner.nextLine();
            }
        }
        HashMap<String, HashMap<String, Integer>> roles = new HashMap<>();
        {
            int n = Integer.parseInt(scanner.nextLine());
            for (int i = 0; i < n; i++) {
                String[] data = scanner.nextLine().split(" ");
                String roleName = data[0];
                HashMap<String, Integer> privileges = new HashMap<>();
                for (int j = 2; j < data.length; j++) {
                    String privilege = data[j];
                    int level = -1;
                    if (privilege.contains(":")) {
                        int index = privilege.indexOf(":");
                        level = Integer.parseInt(privilege.substring(index + 1));
                        privilege = privilege.substring(0, index);
                    }
                    if(privileges.containsKey(privilege)){
                        if(privileges.get(privilege) < level)
                            privileges.put(privilege, level);
                    } else {
                        privileges.put(privilege, level);
                    }
                }
                roles.put(roleName, privileges);
            }
        }
        HashMap<String, HashMap<String, Integer>> users = new HashMap<>();
        {
            int n = Integer.parseInt(scanner.nextLine());
            for (int i = 0; i < n; i++) {
                String[] data = scanner.nextLine().split(" ");
                String userName = data[0];
                HashMap<String, Integer> privileges = new HashMap<>();
                for (int j = 2; j < data.length; j++) {
                    String roleName = data[j];
                    HashMap<String, Integer> rolePrivilege = roles.get(roleName);
                    for (Iterator<String> iterator = rolePrivilege.keySet().iterator(); iterator.hasNext(); ) {
                        String privilege = iterator.next();
                        int level = rolePrivilege.get(privilege);
                        if (privileges.containsKey(privilege)) {
                            if (privileges.get(privilege) < level) {
                                privileges.put(privilege, level);
                            }
                        } else {
                            privileges.put(privilege, level);
                        }
                    }
                }
                users.put(userName, privileges);
            }
        }
        List<String> queries = new ArrayList<>();
        {
            int n = Integer.parseInt(scanner.nextLine());
            for (int i = 0; i < n; i++) {
                queries.add(scanner.nextLine());
            }
        }
        scanner.close();

        for (String query : queries) {
            String[] data = query.split(" ");
            String userName = data[0];
            if (users.containsKey(userName)) {
                HashMap<String, Integer> privileges = users.get(userName);
                String privilege = data[1];
                int level = -1;
                if (privilege.contains(":")) {
                    int index = privilege.indexOf(":");
                    level = Integer.parseInt(privilege.substring(index + 1));
                    privilege = privilege.substring(0, index);
                }
                if (privileges.containsKey(privilege)) {
                    int userLevel = privileges.get(privilege);
                    if(level == -1){
                        System.out.println(userLevel == -1 ? String.valueOf(true) : String.valueOf(userLevel));
                    } else {
                        System.out.println(userLevel >= level);
                    }
                } else {
                    System.out.println(false);
                }
            } else {
                System.out.println(false);
            }
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章