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);
            }
        }
    }
}

 

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