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