闯关第五关的题目,一个中级题和一个高级题。中间题比较简单,半个小时完成了。题目如下
实现一个简易的银行排号叫号系统
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 我的 package breakthrough;
import java.util.LinkedList;
import java.util.Scanner;
/**
* 实现一个简易的银行排号叫号系统
* @author snail
*
*/
public class Main {
private static LinkedList<String> queue = new LinkedList<String>();
private static LinkedList<String> vipQueue = new LinkedList<String>();
private static int count = 0;
private static int mulCall = 0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String string = "";
boolean endFlag = false;
while(!endFlag){
string=scanner.nextLine();
if (string.contains("get")) {
get(string);
}else if (string.contains("call")) {
call();
}else if (string.contains("delete")) {
delete(string);
}else if (string.equals("count")) {
count();
}else if (string.contains("countN")) {
countN(string);
}else if (string.equals("reset")) {
reset();
}else if(string.equals("quit")){
endFlag = true;
}else{
System.out.println("error");
}
}
scanner.close();
}
/*
* 取号。可获取普通号和vip号码。
* 如初始状态,输入"get",则获取普通号码,执行结果为"1",
* 如再次输入"get vip",则获取VIP号码,执行结果为"vip 2"。
* 如果末尾的2号被删除,则再次调用"get"时应输出"2"
* VIP号码有绝对的优先级。普通号和vip号码统一编号,取号均为连续号码。
* 号码从1开始编号,最大为100000.
*/
public static void get(String string) {
count++;
mulCall = 0;
if (string.equals("get")) {
queue.add(String.valueOf(count));
System.out.println(count);
}else if (string.equals("get vip")) {
vipQueue.add("vip "+count);
System.out.println("vip "+count);
}else {
System.out.println("error");
}
}
/*
* 叫号。获取当前应该处理用户的号码。
* 例如当前排队号码为1 2 3 4 5 7,
* 当输入"call",执行结果为"1",
* 如1为vip号码,则为"vip 1".
* 如果再连续调用6次,第六次执行结果应为"error"
*/
public static void call() {
if (!queue.isEmpty()||!vipQueue.isEmpty()) {
mulCall++;
if (mulCall == 6) {
System.out.println("error");
}else{
if (!vipQueue.isEmpty()) {
System.out.println(vipQueue.remove(0));
}else{
System.out.println(queue.remove(0));
}
}
}else{
System.out.println("error");
}
}
/*
*删除号码。
*客户不想办理时可删除号码,叫号时则跳过此号码。
*例如当前排队号码为1 2 3 4 5,输入"delete 5",执行结果为"5",
*如果5为vip则显示"vip 5"。再次输出"delete 5",执行结果为"error"
*/
public static void delete(String string) {
String[] string2 = string.split(" ");
if (string2.length != 2 ||!string2[1].matches("\\d")) {
System.out.println("error");
return;
}else {
for (int i = 0; i < vipQueue.size(); i++) {
if (vipQueue.get(i).contains(string2[1])) {
System.out.println(vipQueue.remove(i));
return;
}
}
for (int i = 0; i < queue.size(); i++) {
if (queue.get(i).contains(string2[1])) {
System.out.println(queue.remove(i));
return;
}
}
System.out.println("error");
return;
}
}
public static void count() {
System.out.println(queue.size()+vipQueue.size());
return;
}
public static void countN(String string) {
String[] string2 = string.split(" ");
if (string2.length != 2 ||!string2[1].matches("\\d")) {
System.out.println("error");
return;
}else {
int vipLength = vipQueue.size();
for (int i = 0; i < vipLength; i++) {
if (vipQueue.get(i).contains(string2[1])) {
System.out.println(i);
return;
}
}
int length = queue.size();
for (int i = 0; i < length; i++) {
if (queue.get(i).equals(string2[1])) {
//System.out.println("vipLength"+vipLength+",i"+i);
System.out.println(i+vipLength);
return;
}
}
System.out.println("error");
return;
}
}
public static void reset() {
queue.clear();
vipQueue.clear();
count = 0;
mulCall = 0;
}
}
|