题解 | #自动售货系统#
自动售货系统
https://www.nowcoder.com/practice/cd82dc8a4727404ca5d32fcb487c50bf
import java.lang.reflect.Array;
import java.util.*;
//一步一步处理,根据输出的先后关系
class Machine{
int remains;//售货机当前剩余的钱币
Map<String, int[]> goods = new LinkedHashMap<>(); //value值为{数量,单价}
Map<Integer, Integer> moneys = new LinkedHashMap<>();
Machine(){};
public int getRemains() {
return remains;
}
public void setRemains(int remains) {
this.remains = remains;
}
Machine(String[] init){
String[] goodsString = init[0].split("-");
String[] moneyString = init[1].split("-");
remains = 0;
int[] prices = {2,3,4,5,8,6};
int[] value = {1,2,5,10};
for(int i=0 ; i<goodsString.length ; ++i){
String name = "A"+(i+1);
goods.put(name, new int[]{Integer.valueOf(goodsString[i]), prices[i]});
}
for(int i=0 ; i<moneyString.length ; ++i){
moneys.put(value[i], Integer.valueOf(moneyString[i]));
}
System.out.println("S001:Initialization is successful");
}
//投币
void pay(int p){
if(!moneys.containsKey(p)){
System.out.println("E002:Denomination error");
return ;
}
if(p > 2){
int remainOT = moneys.get(1)+moneys.get(2)*2;
if(remainOT < p){
System.out.println("E003:Change is not enough, pay fail");
return ;
}
}
int goodsSum=0;
for(String good : goods.keySet()){
goodsSum+=goods.get(good)[0];
}
if(goodsSum==0){
System.out.println("E005:All the goods sold out");
return ;
}
else{
remains+=p;
moneys.put(p, moneys.get(p)+1); //增加售货机该类钱币的张数
System.out.println("S002:Pay success,balance="+remains);
}
}
//购买商品
void buy(String goodName){
if(!goods.containsKey(goodName)){
System.out.println("E006:Goods does not exist");
return ;
}
if(goods.get(goodName)[0] == 0){
System.out.println("E007:The goods sold out");
return ;
}
if(remains < goods.get(goodName)[1]){
System.out.println("E008:Lack of balance");
return ;
}
else{
remains-=goods.get(goodName)[1];
System.out.println("S003:Buy success,balance="+remains);
return ;
}
}
//退款
void refund(){
if(remains == 0){
System.out.println( "E009:Work failure");
return;
}
if(remains > 0){
//最少张数退币
//退币不能多退
int[] values = {10,5,2,1};
List<String> list = new ArrayList<>();
for(int i=0 ; i<values.length ; ++i){
int x = 0;
while(remains >= values[i]){
if(moneys.get(values[i])>0){
++x; //退一张
remains -= values[i];
moneys.put(values[i], moneys.get(values[i])-1);
}
}
list.add(values[i]+" yuan coin number="+ x);
}
for(int i=list.size()-1 ; i>=0 ; --i){
System.out.println(list.get(i));
}
}
}
//查询
void query(int q){
if(q==0){
List<Map.Entry<String, int[]>> goodsList = new ArrayList<>(goods.entrySet());
//linkedhashmap和稳定的collections.sort保证符合题目排序要求
Collections.sort(goodsList, new Comparator<Map.Entry<String, int[]>>() {
@Override
public int compare(Map.Entry<String, int[]> o1, Map.Entry<String, int[]> o2) {
return o2.getValue()[0] - o1.getValue()[0];
}
});
for(int i=0 ; i<goodsList.size() ; ++i){
String goodName = (String) goodsList.get(i).getKey();
System.out.println(goodName+" "+goods.get(goodName)[1]+" "+ goods.get(goodName)[0]);
}
}
else if(q==1){
for(Integer value:moneys.keySet()){
System.out.println(value + " yuan coin number="+moneys.get(value));
}
}
else{
System.out.println("E010:Parameter error");
}
}
}
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
String order = in.nextLine();
String[] orders = order.split(";");
String[] initialize = orders[0].substring(2).split(" ");//去除r字符并且去掉分隔符-
//System.out.println(Arrays.toString(initialize)); 测试输入
Machine machine = new Machine(initialize); //先初始化
//System.out.println(Arrays.toString(orders));
for(int i=1 ; i<orders.length ; ++i){
//必须是p 1,如果没有中间的空格,则是错误的输入
if(orders[i].charAt(0) == 'r'){
initialize = orders[i].substring(2).split(" ");
machine = new Machine(initialize);
}
else if(orders[i].charAt(0) == 'p'){
machine.pay(Integer.valueOf(orders[i].substring(2)));
}
else if(orders[i].charAt(0) == 'b'){
machine.buy(orders[i].substring(2));
}
else if(orders[i].charAt(0) == 'c'){
machine.refund();
}
else if(orders[i].charAt(0) == 'q'){
if(orders[i].length() != 3 || !Character.isDigit(orders[i].charAt(2))){
System.out.println("E010:Parameter error");
continue;
}
machine.query(Integer.valueOf(orders[i].substring(2)));
}
}
}
}

查看19道真题和解析