华为机试题:实现一个简易的银行叫号系统
2015-08-06 18:19
381 查看
排号机
描述:
实现一个简易的银行排号叫号系统
get 取号 示例:”get”或”get vip”
call 叫号 示例:”call”
delete 删除号码 示例:”delete 5”
count 获取当前排队总人数 示例:”count”
countN 获取号码N以前的排队人数 示例:”countN”
reset 重置排号机 示例:”reset”
quit 退出排号机 示例:”quit”
运行时间限制: 无限制
内存限制: 无限制
输入:
每行只会有一条输入(比如:C语言可使用gets函数获取一行输入命令的字符串)。
1、若输入不符合要求(如:命令字非法,或其他认为输入的错误)均需输出”error”
2、每条输出后使用换行符隔开(如后面示例)
输出:
1)取号。可获取普通号和vip号码。如初始状态,输入”get”,则获取普通号码,执行结果为”1”,如再次输入”get vip”,则获取VIP号码,执行结果为”vip 2”。如果末尾的2号被删除,则再次调用”get”时应输出”2”
VIP号码有绝对的优先级。普通号和vip号码统一编号,取号均为连续号码。号码从1开始编号,最大为100000.
2)叫号。获取当前应该处理用户的号码。例如当前排队号码为1 2 3 4 5 7,当输入”call”,执行结果为”1”,如1为vip号码,则为”vip 1”.如果再连续调用6次,第六次执行结果应为”error”
3)删除号码。客户不想办理时可删除号码,叫号时则跳过此号码。例如当前排队号码为1 2 3 4 5,输入”delete 5”,执行结果为”5”,如果5为vip则显示”vip 5”。再次输出”delete 5”,执行结果为”error”
4)获取当前排队总人数。获取当前排队人数。例如当前排队号码为1 2 3 4 5 6,执行结果为”6”
5)获取在某个号码之前排队的总人数。例如当前排队号码为1 2 3 4 5 7,输入”countN 7”,执行结果为”5”
6、重置排号机。例如输入”reset”,则重置排号机,进入初始状态,无需输出。
7、退出排号机。例如输入”quit”,则退出排号机,无需输出。
样例输入:
get
get
get
get vip
count
countN 1
call
quit
样例输出:
1
2
3
vip 4
4
1
vip 4
我的答案(java):
描述:
实现一个简易的银行排号叫号系统
get 取号 示例:”get”或”get vip”
call 叫号 示例:”call”
delete 删除号码 示例:”delete 5”
count 获取当前排队总人数 示例:”count”
countN 获取号码N以前的排队人数 示例:”countN”
reset 重置排号机 示例:”reset”
quit 退出排号机 示例:”quit”
运行时间限制: 无限制
内存限制: 无限制
输入:
每行只会有一条输入(比如:C语言可使用gets函数获取一行输入命令的字符串)。
1、若输入不符合要求(如:命令字非法,或其他认为输入的错误)均需输出”error”
2、每条输出后使用换行符隔开(如后面示例)
输出:
1)取号。可获取普通号和vip号码。如初始状态,输入”get”,则获取普通号码,执行结果为”1”,如再次输入”get vip”,则获取VIP号码,执行结果为”vip 2”。如果末尾的2号被删除,则再次调用”get”时应输出”2”
VIP号码有绝对的优先级。普通号和vip号码统一编号,取号均为连续号码。号码从1开始编号,最大为100000.
2)叫号。获取当前应该处理用户的号码。例如当前排队号码为1 2 3 4 5 7,当输入”call”,执行结果为”1”,如1为vip号码,则为”vip 1”.如果再连续调用6次,第六次执行结果应为”error”
3)删除号码。客户不想办理时可删除号码,叫号时则跳过此号码。例如当前排队号码为1 2 3 4 5,输入”delete 5”,执行结果为”5”,如果5为vip则显示”vip 5”。再次输出”delete 5”,执行结果为”error”
4)获取当前排队总人数。获取当前排队人数。例如当前排队号码为1 2 3 4 5 6,执行结果为”6”
5)获取在某个号码之前排队的总人数。例如当前排队号码为1 2 3 4 5 7,输入”countN 7”,执行结果为”5”
6、重置排号机。例如输入”reset”,则重置排号机,进入初始状态,无需输出。
7、退出排号机。例如输入”quit”,则退出排号机,无需输出。
样例输入:
get
get
get
get vip
count
countN 1
call
quit
样例输出:
1
2
3
vip 4
4
1
vip 4
我的答案(java):
import java.util.Scanner; import java.util.TreeSet; public class Main{ private final String VIP="vip"; private long num=1;// 号码 1~100000 private TreeSet<Long> vipNums=new TreeSet<Long>();// 保存vip号码 private TreeSet<Long> queue=new TreeSet<Long>();// 队列 private boolean quit;// 是否退出 public String[] input(Scanner sc){ String line=null; String[] comd=null; try{ line=sc.nextLine(); comd=line.split(" ");// 拆分命令 }catch(Exception e){ // e.printStackTrace(); comd=null; printError(); }finally{ // sc.close(); } return comd; } public void handle(String[] comd) throws Exception{ if(comd==null||comd.length==0){ printError(); } String str=comd[0];// 提取命令 if(str.equals("get")){ if(num<1||num>100000){// ERROR printError(); } if(comd.length==2){ String str2=comd[1]; if(str2.equals(VIP)){// get vip num System.out.println(VIP+" "+num); vipNums.add(num); }else{ printError(); } }else{ System.out.println(num);// get common num } queue.add(num);// 把取的号加入队列 num++; }else if(str.equals("call")){ Long first=null; // vip first if(vipNums.size()>0){ first=vipNums.first(); System.out.println(VIP+" "+first); vipNums.remove(first); queue.remove(first); }else if(queue.size()>0){ first=queue.first(); System.out.println(first); queue.remove(first); }else{ printError(); } }else if(str.equals("delete")){ if(comd.length==2){ String str2=comd[1]; Long numToDel=Long.parseLong(str2); if(queue.contains(numToDel)){ if(vipNums.contains(numToDel)){ System.out.println(VIP+" "+numToDel); vipNums.remove(numToDel); }else{ System.out.println(numToDel); } if(queue.last().equals(numToDel)){ num--; } queue.remove(numToDel); }else{ printError(); } }else{ printError(); } }else if(str.equals("count")){ System.out.println(queue.size()); }else if(str.equals("countN")){ if(comd.length==2){ String str2=comd[1]; Long numToCount=Long.parseLong(str2); if(queue.contains(numToCount)){ int count=0; for(Long number : queue){ if(number<numToCount){ count++; } } System.out.println(count); }else{ printError(); } }else{ printError(); } }else if(str.equals("reset")){ num=1; vipNums.clear(); queue.clear(); }else if(str.equals("quit")){ quit=true; }else{ printError(); } } public void printError(){ System.out.println("error"); } public static void main(String[] args){ Scanner sc=new Scanner(System.in); Main m=new Main(); while(!m.quit){ String[] comd=m.input(sc); try { if(comd==null){ throw new Exception("comd is null"); } m.handle(comd); } catch (Exception e) { m.printError(); // e.printStackTrace(); } } sc.close(); } }
相关文章推荐
- STM32 USB FS Core and USB OTG Core
- 手势冲突UIPanGestureRecognizer 和UIPinchGestureRecognizer
- pkg-config的用法
- Android WebView加载本地CSS
- 【Android】五大布局
- [Javascript] Array.prototype.slice.call(obj)用法
- javascript 记录按键动作和按键时间
- iOS多线程——GCD篇
- 求二维数组每列中最大元素,并依次放入一位数组中
- 在线阅读android源码
- Android的RelativeLayout的view的layout_marginBottom不起作用
- org.hibernate.PropertyNotFoundException
- PopupWindow的各种用法(二)——使用PopupWindow做一个指引蒙板(带启动页,仿ViewPager滚动的引导页)
- C++_运算符重载_前缀自增与后缀自增
- Objective-C—— Block
- noip1996 数制转换 -提高组 (高精度+进制转换)
- Kernel那些事儿之内存管理(11) --- 内核映射(上)
- CentOS 6.3下源码安装LAMP(Linux+Apache+Mysql+Php)环境
- tcp服务器组包
- MySql常用命令总结