排号机
描述:
实现一个简易的银行排号叫号系统
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();
}
}