华为机试题:实现一个简易的银行叫号系统

本文介绍了一个简易银行排号系统的实现方法,包括取号、叫号、删除号码等功能,并提供了一个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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值