CCF第九次认证第三题权限查询参考答案
来源:互联网 发布:js集合删除元素 编辑:程序博客网 时间:2024/05/04 11:04
试题名称: 权限查询
我用java语言编写,经过多次优化测试,终于符合要求。
下面贴出最新的代码
import java.util.Scanner;public class Main { //private static Privi[] arrayPrivi; //private static Role[] arrayRole; //private static User[] arrayUser; public static void main(String[] args) { Scanner cin = new Scanner(System.in); // input Privission list int p = cin.nextInt(); Privi[] arrayPrivi = new Privi[p]; //List<Privi> priviList = new ArrayList<Privi>(); for (int i = 0; i < p; i++) { arrayPrivi[i] = new Privi(cin.next()); } // input role list int r = cin.nextInt(); Role[] arrayRole = new Role[r]; for (int i = 0; i < r; i++) { String name = cin.next(); int countrole = cin.nextInt(); Role ro = new Role(name, countrole); for (int j = 0; j < countrole; j++) { ro.addPrivi(j, new Privi(cin.next())); } arrayRole[i] = ro; } // input user list; int u = cin.nextInt(); User[] arrayUser = new User[u]; for (int i = 0; i < u; i++) { String name = cin.next(); int countrole = cin.nextInt(); User us = new User(name,countrole); for (int j = 0; j < countrole; j++) { us.addRole(j, roleFactory(arrayRole,cin.next())); } arrayUser[i] = us; } // int q = cin.nextInt(); Query[] arrayQuery = new Query[q]; for (int i = 0; i < q; i++) { arrayQuery[i] = new Query(cin.next(),cin.next()); } cin.close(); //query //long timeBefore = System.currentTimeMillis(); StringBuilder sb = new StringBuilder(); for (Query query : arrayQuery) { sb.append(check(query,arrayUser) + "\n"); } System.out.println(sb.toString()); //long timeAfter = System.currentTimeMillis(); //System.out.println("use time:" + (timeAfter - timeBefore)); } /** * */ private static Role roleFactory(Role[] arrayRole,String name) { for(Role role : arrayRole) { if(name.equals(role.getName())) { return role; } } return null; } /** */ private static String check(Query query,User[] arrayUser) { int flag = -3; String uname = query.qUserName; Privi up = query.qPrivi; for (User user : arrayUser) { flag = -3; if (uname.equals(user.getName())) { Role[] userRoleArr = user.getRoleArray(); for (Role role : userRoleArr) { Privi[] userRolePriviArr = role.getPriviArray(); for (Privi privi : userRolePriviArr) { int temp = up.equals(privi); flag = (temp > flag) ? temp : flag; if(flag == -1) return "true"; } } break; } } if (flag == -2 || flag == -3) { return "false"; } else return flag + ""; } static class Query { public String qUserName; public Privi qPrivi; Query(String username, String Priviname) { this.qUserName = username; this.qPrivi = new Privi(Priviname); } }}class Privi { private String name; private int level; public Privi() {} public Privi(String per) { String[] p = per.split(":"); if (p.length == 1) { Privi.this.name = p[0]; Privi.this.level = -1; } else if (p.length == 2) { Privi.this.name = p[0]; Privi.this.level = Integer.parseInt(p[1]); } } public String getName() { return this.name; } public void setName(String s) { this.name = s; } public int getLevel() { return this.level; } public void setLevel(int l) { this.level = l; } public int equals(Privi p) { if (this.name.equals(p.getName())) { if(this.level == -1 && this.level < p.getLevel()) return p.getLevel(); else if(this.level == -1 && p.getLevel() == -1) return -1;//bufendengji else if(this.level != -1 && this.level <= p.getLevel() ) return -1;//fendengji else return -2; // } else return -2; } public String toString() { return this.name +(this.level != -1 ? (":" + this.level) : ""); }}class Role { private String name; private int countPrivi; private Privi[] arrPrivi; //private List<Privi> priList; public Role() { this.name = ""; //this.priList = new ArrayList<Privi>(); } public Role(String n,int count) { this.name = n; this.countPrivi = count; this.arrPrivi = new Privi[count]; } public String getName() { return this.name; } public void setName(String s) { this.name = s; } public int getPriviCount() { return this.arrPrivi.length; } public Privi[] getPriviArray() { return this.arrPrivi; } public void addPrivi(int n,Privi p) { this.arrPrivi[n] = p; } public String toString() { String s = this.name + "~" ; for(Privi p : this.arrPrivi) { s += p.toString() + "+"; } return s; }}class User { private String name; private int countRole; private Role[] arrRole; public User() { this.name = ""; //this.roleList = new ArrayList<Role>(); } public User(String name, int count) { this.name = name; this.countRole = count; this.arrRole = new Role[count]; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public Role[] getRoleArray() { return this.arrRole; } public void addRole(int n, Role role) { this.arrRole[n] = role; } public String toString() { String s = name + "~"; for(Role role : arrRole) { s += role.toString() + "+"; } return s; }}
这个是之前的版本,运行结果正确,但是运行超时。可以与上面进行对比。主要优化点有:
(1)将List改为Array;
(2)将全局变量改为局部变量;
(3)输出采用StringBuilder;
(4)check()方法中,进一步精确了终止循环的时间;这应该是最显著的改善点。
import java.util.List;import java.util.ArrayList;import java.util.Scanner;public class Main { private static List<Privi> priviList = new ArrayList<Privi>(); private static List<Role> roleList = new ArrayList<Role>(); private static List<User> userList = new ArrayList<User>(); public static void main(String[] args) { Scanner cin = new Scanner(System.in); // input Privilege list int p = cin.nextInt(); for (int i = 0; i < p; i++) { priviList.add(new Privi(cin.next())); } // input role list int r = cin.nextInt(); for (int i = 0; i < r; i++) { // Role ro = new Role(cin.next()); int pn = cin.nextInt(); for (int j = 0; j < pn; j++) { ro.addPrivi(new Privi(cin.next())); } roleList.add(ro); } // input user list; int u = cin.nextInt(); for (int i = 0; i < u; i++) { User us = new User(cin.next()); int rn = cin.nextInt(); for (int j = 0; j < rn; j++) { us.addRole(roleFactory(cin.next())); } userList.add(us); } // int q = cin.nextInt(); List<Query> queryList = new ArrayList<Query>(); for (int i = 0; i < q; i++) { Query qu = new Query(cin.next(),cin.next()); queryList.add(qu); } //query for (Query query : queryList) { System.out.println(check(query)); } cin.close(); } /** * */ private static Role roleFactory(String name) { for(Role role : roleList) { if(name.equals(role.getName())) { return role; } } return null; } /** */ private static String check(Query query) { int flag = -3; for (User user : userList) { flag = -3; if (query.qUserName.equals(user.getName())) { List<Role> userRoleList = user.getRoleList(); for (Role role : userRoleList) { List<Privi> userRolePriviList = role.getPriviList(); for (Privi privi : userRolePriviList) { int temp = query.qPrivi.equals(privi); flag = (temp > flag) ? temp : flag; if(flag == -1) break; } if(flag == -1) break; } } if (flag != -3) { break; } } if (flag == -2 || flag == -3) { return "false"; } else if(flag == -1) { return "true"; } else return flag + ""; } static class Query { public String qUserName; public Privi qPrivi; Query() { qUserName = ""; qPrivi = new Privi(); } Query(String username) { this.qUserName = username; this.qPrivi = new Privi(); } Query(String username, String Priviname) { this.qUserName = username; this.qPrivi = new Privi(Priviname); } } static class Privi { private String name; private int level; public Privi() {} public Privi(String per) { String[] p = per.split(":"); if (p.length == 1) { Privi.this.name = p[0]; Privi.this.level = -1; } else if (p.length == 2) { Privi.this.name = p[0]; Privi.this.level = Integer.parseInt(p[1]); } } public String getName() { return this.name; } public void setName(String s) { this.name = s; } public int getLevel() { return this.level; } public void setLevel(int l) { this.level = l; } public int equals(Privi p) { if (this.name.equals(p.getName())) { if(this.level == -1 && this.level < p.getLevel()) return p.getLevel(); else if(this.level == -1 && p.getLevel() == -1) return -1;//bufendengji else if(this.level != -1 && this.level <= p.getLevel() ) return -1;//fendengji else return -2; // } else return -2; } public String toString() { return this.name +(this.level != -1 ? (":" + this.level) : ""); } } static class Role { private String name; private List<Privi> priList; public Role() { this.name = ""; this.priList = new ArrayList<Privi>(); } public Role(String n) { this.name = n; this.priList = new ArrayList<Privi>(); } public String getName() { return this.name; } public void setName(String s) { this.name = s; } public int getPriviCount() { return this.priList.size(); } public List<Privi> getPriviList() { return this.priList; } public void addPrivi(Privi p) { this.priList.add(p); } public String toString() { String s = this.name + "~" ; for(Privi p : this.priList) { s += p.toString() + "+"; } return s; } } static class User { private String name; private List<Role> roleList; public User() { this.name = ""; this.roleList = new ArrayList<Role>(); } public User(String name) { this.name = name; this.roleList = new ArrayList<Role>(); } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public List<Role> getRoleList() { return this.roleList; } public void addRole(Role role) { this.roleList.add(role); } public String toString() { String s = name + "~"; for(Role role : roleList) { s += role.toString() + "+"; } return s; } }}
参考资料
https://zhuanlan.zhihu.com/p/23390311
http://blog.csdn.net/huchunfu/article/details/8126092
感谢原作者及分享者。
1 0
- CCF第九次认证第三题权限查询参考答案
- 第九届CCF CSP认证 第三题:权限查询
- CCF csp第九次认证考试 试题三 权限查询
- 第九次ccf-权限查询
- ccf认证权限查询
- ccf csp第九次认证考试 第二题 工资计算
- 第九次CCF CSP认证试题
- CCF认证 201612-3 权限查询
- ccf认证权限查询40分
- CCF认证 2016-12 权限查询
- 第五届ccf认证考试第三题
- 2016.12 第九次CCF 总结
- 第九次ccf-工资计算
- 第九次CCF 压缩编码
- CCF认证考试201612-3 权限查询题解
- CCF 第7次认证
- ccf csp第八次认证
- 第六次CCF计算机软件能力认证考试(第四题)
- Android的ion相关学习(二)附件之<kzalloc 函数详解>
- 一个执行计划异常变更的案例 - 外传之绑定变量窥探
- 微信小程序--标题栏(改标题)
- 云计算如大宝剑。
- Cocoapos 报错 Generating Pods project Abort trap: 6
- CCF第九次认证第三题权限查询参考答案
- maven命令行创建目录
- [NodeJs] Express + Mongodb + Materialize 搭建多人博客
- 选项卡
- jdbc BaseDao封装
- POj 3321 树状数组苹果树
- iOS自学笔记之UISlider
- 设计模式 —— 状态模式g
- TypeScript基础-类型与变量