题解 | #自动售货系统#

自动售货系统

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");
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务