题解 | #自动售货系统#

自动售货系统

https://www.nowcoder.com/practice/cd82dc8a4727404ca5d32fcb487c50bf

上午2h加下午1h才搞定。。。。这就是考业务理解能力吧,有很多细节需要注意。没啥难点,就是看你对细节的把握。退款那里一开始以为是dp,但没思路,用贪心的思想做出来了。

踩坑的地方不算多:

1.余额等于上次余额+本次投币值

2.错误优先级(这块大量使用了if else逻辑)

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String cmd = in.nextLine();
            //指令分割:初始化和操作指令
            String[] commands = cmd.split(";");
            String initial = commands[0];
            //商品数、钱币盒信息获取
            String[] goodsAndMoney = initial.split(" ");
            //商品数量初始化
            String goodsNum = goodsAndMoney[1];
            Map<String, Integer> goodsMap = new LinkedHashMap<>();
            String[] kindNum = goodsNum.split("-");
            char good = 'A';
            for (int i = 0; i < kindNum.length; i++) {
                String goodName = Character.toString(good) + (i + 1);
                goodsMap.put(goodName, Integer.parseInt(kindNum[i]));
            }
            //钱盒信息初始化
            String moneyBox = goodsAndMoney[2];
            String[] moneyNum = moneyBox.split("-");
            Map<Integer, Integer> moneyMap = new LinkedHashMap<>();
            moneyMap.put(1, Integer.parseInt(moneyNum[0]));
            moneyMap.put(2, Integer.parseInt(moneyNum[1]));
            moneyMap.put(5, Integer.parseInt(moneyNum[2]));
            moneyMap.put(10, Integer.parseInt(moneyNum[3]));
            //投币余额初始化
            int[] rest = new int[1];
            rest[0] = 0;
            //商品单价初始化
            Map<String, Integer> goodPrice = new LinkedHashMap<>();
            goodPrice.put("A1", 2);
            goodPrice.put("A2", 3);
            goodPrice.put("A3", 4);
            goodPrice.put("A4", 5);
            goodPrice.put("A5", 8);
            goodPrice.put("A6", 6);
            System.out.println("S001:Initialization is successful");
            for (int i = 1; i < commands.length; i++) {
                String currentCMD = commands[i];
                //操作售货机
                saleMachine(currentCMD, goodsMap, moneyMap, goodPrice, rest);
            }
        }
    }
    public static void saleMachine(String cmd, Map<String, Integer> goodsMap,
                                   Map<Integer, Integer> moneyMap, Map<String, Integer> goodPrice, int[] rest) {
        //指令识别
        if (cmd.startsWith("q")) {
            String res = "";
            //细分查询种类,需要携带
            if (cmd.equals("q 0")) {
                //查商品信息
                res = queryGoods(goodsMap);
            } else if (cmd.equals("q 1")) {
                res = queryMoney(moneyMap);
            } else {
                res = "E010:Parameter error";
            }
            System.out.println(res);
        } else if (cmd.startsWith("p")) {
            String res = "";
            res = pay(cmd, goodsMap, moneyMap, rest);
            System.out.println(res);
        } else if (cmd.startsWith("b")) {
            String res = "";
            res = buy(cmd, goodsMap, goodPrice, rest);
            System.out.println(res);
        } else if (cmd.equals("c")) {
            //退币
            String[] results = quitMoney(moneyMap, rest);
            for (String s : results) {
                if (s != null) {
                    System.out.println(s);
                }
            }
        }
    }
    //投币
    public static String pay(String pay, Map<String, Integer> goodsMap,
                             Map<Integer, Integer> moneyMap, int[] rest) {
        String res = "";
        //检查命令
        String[] coms = pay.split(" ");
        String num = coms[1];
        int payNum = Integer.parseInt(num);
        if (!(num.equals("1") || num.equals("2") || num.equals("5") ||
                num.equals("10"))) {
            res = "E002:Denomination error";
        } else if (payNum != 1 && payNum != 2 &&
                   payNum > (moneyMap.get(1) + moneyMap.get(2) * 2)) {//判断零钱是否充足
            res = "E003:Change is not enough, pay fail";
        } else {
            //商品售罄检查
            int sign = 0;
            for (String kind : goodsMap.keySet()) {
                if (goodsMap.get(kind) == 0) {
                    sign++;
                }
            }
            if (sign == 6) {
                res = "E005:All the goods sold out";
            } else {
                rest[0] += payNum;
                //对应币数量加1
                moneyMap.put(payNum, moneyMap.get(payNum) + 1);
                res = "S002:Pay success,balance=" +  rest[0];
            }
        }
        return res;
    }
//查询
    public static String queryGoods(Map<String, Integer> goodsMap) {
        Set<String> set = goodsMap.keySet();
        String res = "";
        for (String kind : set) {
            if (kind.equals("A1")) {
                res = kind  + " " + 2 + " " + goodsMap.get(kind);
            } else if (kind.equals("A2")) {
                res = kind  + " " + 3 + " " + goodsMap.get(kind);
            } else if (kind.equals("A3")) {
                res = kind  + " " + 4 + " " + goodsMap.get(kind);
            } else if (kind.equals("A4")) {
                res = kind  + " " + 5 + " " + goodsMap.get(kind);
            } else if (kind.equals("A5")) {
                res = kind  + " " + 8 + " " + goodsMap.get(kind);
            } else if (kind.equals("A6")) {
                res = kind  + " " + 6 + " " + goodsMap.get(kind);
            }
        }
        return res;
    }
//查询钱盒
    public static String queryMoney(Map<Integer, Integer> moneyMap) {
        Set<Integer> set = moneyMap.keySet();
        String res = "";
        String mid = "yuan coin number=";
        for (Integer kind : set) {
            if (kind == 1) {
                res = kind  + " " + mid + moneyMap.get(kind);
            } else if (kind == 2) {
                res = kind  + " " + mid + moneyMap.get(kind);
            } else if (kind == 5) {
                res = kind  + " " + mid + moneyMap.get(kind);
            } else if (kind == 10) {
                res = kind  + " " + mid + moneyMap.get(kind);
            }
        }
        return res;
    }
//购买
    public static String buy(String cmd, Map<String, Integer> goodsMap,
                             Map<String, Integer> goodPrice,
                             int[] rest) {
        String res = "";
        //检查商品是否存在
        String goodName = cmd.split(" ")[1];
        if (!(goodName.equals("A1") || goodName.equals("A2") || goodName.equals("A3") ||
                goodName.equals("A4") || goodName.equals("A5") || goodName.equals("A6"))) {
            res = "E006:Goods does not exist";
        } else if (goodsMap.get(goodName) == 0) {
            res = "E007:The goods sold out";
        } else if (rest[0] < goodPrice.get(goodName)) {
            res = "E008:Lack of balance";
        } else {
            //购买成功
            rest[0] = rest[0] - goodPrice.get(goodName);
            res = "S003:Buy success,balance=" + rest[0];
        }
        return res;

    }
//退币
    public static String[] quitMoney(Map<Integer, Integer> moneyMap, int[] rest) {
        String[] res = new String[4];
        String mid = "yuan coin number=";
        if (rest[0] == 0) {
            res[0] = "E009:Work failure";
        } else {
            //动态规划求最少币组合
            int money = rest[0];
            //投币余额清零:从大到小
            int num10 = 0;
            int num5 = 0;
            int num2 = 0;
            int num1 = 0;
            if (money >= 10) {
                //多少个10
                num10 = money / 10;
                //查看余额
                int c = moneyMap.get(10);
                if (c < num10) {
                    num10 = c;
                } else {
                    moneyMap.put(10, c - num10);
                }
                money -= num10 * 10;
            }
            if (money >= 5) {
                //多少个5
                num5 = money / 5;
                //查看余额
                int c = moneyMap.get(5);
                if (c < num10) {
                    num5 = c;
                } else {
                    moneyMap.put(5, c - num5);
                }
                money -= num5 * 5;
            }
            if (money >= 2) {
                //多少个2
                num2 = money / 2;
                //查看余额
                int c = moneyMap.get(2);
                if (c < num2) {
                    num2 = c;
                } else {
                    moneyMap.put(2, c - num2);
                }
                money -= num2 * 2;
            }
            if (money >= 1) {
                //多少个1
                num1 = money;
                int c = moneyMap.get(1);
                if (c < num1) {
                    num2 = c;
                } else {
                    moneyMap.put(1, c - num1);
                }
                money -= num1 * 2;
            }
            //钱盒各面值币数量更正
            res[0] = 1 + " " + mid + num1;
            res[1] = 2 + " " + mid + num2;
            res[2] = 5 + " " + mid + num5;
            res[3] = 10 + " " + mid + num10;
            rest[0] = 0;
            return res;
        }
        return res;
    }
}
全部评论

相关推荐

zYvv:双一流加大加粗再标红,然后广投。主要是获奖荣誉不够,建议开始不用追求大厂,去别的厂子刷下实习。
点赞 评论 收藏
分享
07-14 13:37
重庆大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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