您的位置:首页 > 其它

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

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):

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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: