题解 | #自动售货系统#
自动售货系统
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; } }