题解 | #自动售货系统#
自动售货系统
https://www.nowcoder.com/practice/cd82dc8a4727404ca5d32fcb487c50bf
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
// 售货机初始化参数为10个数字,前6个为A1~A6商品的数量,后4个为1元,2元,5元,10元的面额张数
int initialArr[] = new int[10];
// 商品A1~A6的单价
int goodsPriceArr[] = new int[]{2, 3, 4, 5, 8, 6};
// 投币面额
int payment = 0;
// 存钱盒面额
List<String> moneyList = Arrays.asList("1", "2", "5", "10");
// 商品名称
List<String> goodsNameList = Arrays.asList("A1", "A2", "A3", "A4", "A5", "A6");
Scanner in = new Scanner(System.in);
while (in.hasNextLine()) {
String str = in.nextLine();
if (str.trim().length() == 0) {
continue;
}
// 以;分隔命令
String[] commands = str.split(";");
// 处理命令
// r命令
for (String command : commands) {
if (command.startsWith("r")) {
// 以空格分隔,第一个为命令r,第二个商品数量,第三个为面额数量
initializationOp(initialArr, command);
} else if (command.startsWith("p")) {
// 投币操作
int payResult = paymentOp(initialArr, moneyList, command);
if (payResult > 0) {
payment += payResult;
// 如果投币成功,输出“S002:Pay success,balance=X”;
System.out.println("S002:Pay success,balance=" + payment);
}
} else if (command.startsWith("b")) {
// 购买商品
int buyResult = buyGoods(initialArr, goodsPriceArr, payment, goodsNameList, command);
if (buyResult > 0) {
payment -= buyResult;
// 如果购买成功,输出“S003:Buy success,balance=X”;
System.out.println("S003:Buy success,balance=" + payment);
}
} else if (command.startsWith("c")) {
// 退币
int[] denoArr = coinReturn(payment);
for (int i = 0; i < denoArr.length; i++) {
payment -= Integer.parseInt(moneyList.get(i)) * denoArr[i];
initialArr[6 + i] -= denoArr[i];
}
} else {
// 查询
queryOp(initialArr, goodsPriceArr, goodsNameList, command);
}
}
}
}
private static void queryOp(int[] initialArr, int[] goodsPriceArr, List<String> goodsNameList, String command) {
String[] pMand = command.split(" ");
if (pMand.length != 2) {
System.out.println("E010:Parameter error");
return;
}
int flag = Integer.parseInt(pMand[1]);
// 查询面额
if (flag == 1) {
System.out.println("1 yuan coin number=" + initialArr[6]);
System.out.println("2 yuan coin number=" + initialArr[7]);
System.out.println("5 yuan coin number=" + initialArr[8]);
System.out.println("10 yuan coin number=" + initialArr[9]);
return;
}
// 查询商品
List<String> countList = new ArrayList<>();
for (int i = 0; i < 6; i++) {
countList.add(goodsNameList.get(i) + "_" + initialArr[i]);
}
// 正序排序后,读取时要反向读,从大到小
Collections.sort(countList, (o1, o2) -> {
String[] o1Strs = o1.split("_");
String[] o2Strs = o2.split("_");
// 先以商品数量排序
int o1Num = Integer.parseInt(o1Strs[1]);
int o2Num = Integer.parseInt(o2Strs[1]);
if (o1Num > o2Num) {
return 1;
} else if (o1Num < o2Num) {
return -1;
} else {
// 以名称排序
return o1Strs[0].compareTo(o2Strs[0]);
}
});
for (String s : countList) {
String goodsName = s.split("_")[0];
Integer goodsIndex = Integer.parseInt(goodsName.substring(1)) - 1;
String countStr = s.split("_")[1];
System.out.println(goodsName + " " + goodsPriceArr[goodsIndex] + " " + countStr);
}
}
private static int[] coinReturn(int payment) {
// 如果投币余额等于0的情况下,输出“E009:Work failure”;
int[] denoArr = new int[4];
if (payment == 0) {
System.out.println("E009:Work failure");
return denoArr;
}
// 计算需要退的币面额张数
recursiveCalcCoin(denoArr, payment);
System.out.println("1 yuan coin number=" + denoArr[0]);
System.out.println("2 yuan coin number=" + denoArr[1]);
System.out.println("5 yuan coin number=" + denoArr[2]);
System.out.println("10 yuan coin number=" + denoArr[3]);
return denoArr;
}
private static void recursiveCalcCoin(int[] denoArr, int payment) {
int div = payment / 10;
if (div > 0) {
denoArr[3] += div;
recursiveCalcCoin(denoArr, payment - div * 10);
} else {
div = payment / 5;
if (div > 0) {
denoArr[2] += div;
recursiveCalcCoin(denoArr, payment - div * 5);
} else {
div = payment / 2;
if (div > 0) {
denoArr[1] += div;
recursiveCalcCoin(denoArr, payment - div * 2);
} else {
denoArr[0] += payment;
}
}
}
}
private static int buyGoods(int[] initialArr, int[] goodsPriceArr, int payment, List<String> goodsNameList, String command) {
String[] bMands = command.split(" ");
if (bMands.length != 2) {
System.out.println("E010:Parameter error");
return 0;
}
String goodsName = bMands[1];
// 如果购买的商品不在商品列表中,输出“E006:Goods does not exist”;
if (!goodsNameList.contains(goodsName)) {
System.out.println("E006:Goods does not exist");
return 0;
}
int goodsIndex = Integer.parseInt(goodsName.substring(1)) - 1;
// 如果所购买的商品的数量为0,输出“E007:The goods sold out”
int goodsNum = initialArr[goodsIndex];
if (goodsNum == 0) {
System.out.println("E007:The goods sold out");
return 0;
}
// 如果投币余额小于待购买商品价格,输出“E008:Lack of balance”;
if (payment < goodsPriceArr[goodsIndex]) {
System.out.println("E008:Lack of balance");
return 0;
}
return goodsPriceArr[goodsIndex];
}
private static int paymentOp(int[] initialArr, List<String> moneyList, String command) {
String[] pMands = command.split(" ");
if (pMands.length != 2) {
System.out.println("E010:Parameter error");
return 0;
}
// 判断面额是否符合要求
String moneyStr = pMands[1];
if (!moneyList.contains(moneyStr)) {
System.out.println("E002:Denomination error");
return 0;
}
// 如果存钱盒中1元和2元面额钱币总额小于本次投入的钱币面额,输出“E003:Change is not enough, pay fail”,
// 但投入1元和2元面额钱币不受此限制。
if (!moneyStr.equals("1") && !moneyStr.equals("2")) {
int oneCount = initialArr[6];
int twoCount = initialArr[7];
if (oneCount + 2 * twoCount < Integer.parseInt(moneyStr)) {
System.out.println("E003:Change is not enough, pay fail");
return 0;
}
}
// 如果自动售货机中商品全部销售完毕,投币失败。输出“E005:All the goods sold out”;
int totalCount = 0;
for (int i = 0; i < 6; i++) {
totalCount += initialArr[i];
}
if (totalCount == 0) {
System.out.println("E005:All the goods sold out");
return 0;
}
int payMoney = Integer.parseInt(moneyStr);
// 给对应的面额数量加1
for (int i = 0; i < moneyList.size(); i++) {
if (moneyList.get(i).equals(moneyStr)) {
initialArr[6 + i] += 1;
break;
}
}
return payMoney;
}
private static void initializationOp(int[] initialArr, String command) {
String[] rMands = command.split(" ");
if (rMands.length != 3) {
System.out.println("E010:Parameter error");
return;
}
String goodsStr = rMands[1];
String moneyStr = rMands[2];
String[] goodsArr = goodsStr.split("-");
String[] moneyArr = moneyStr.split("-");
for (int i = 0; i < goodsArr.length; i++) {
initialArr[i] = Integer.parseInt(goodsArr[i]);
}
// 获取索引位置
int thisIndex = goodsArr.length;
for (int i = 0; i < moneyArr.length; i++) {
initialArr[thisIndex + i] = Integer.parseInt(moneyArr[i]);
}
System.out.println("S001:Initialization is successful");
}
}

查看21道真题和解析