题解 | #自动售货系统#
自动售货系统
https://www.nowcoder.com/practice/cd82dc8a4727404ca5d32fcb487c50bf
本题逻辑并不复杂, 但是条件,逻辑非常多
主要有四个难点
1: 字符串的切割, 不要搞乱了, 尤其是对于一些非法输入的处理
2: 余额,钱币数量的维护
3: 数量从大到小排序, 但是数量相同的名称在前, 就是稳定排序
4: 退币原则, 使用贪心算法算出
但是本题最难的是考试的时候不会提供测试用例, 所以基本上做不出来, 而且做出来了也需要调试很久, 得不偿失
import javax.swing.plaf.metal.MetalIconFactory;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main
{
//S001:Initialization is successful
//E009:Work failure
//E010:Parameter error
//S002:Pay success,balance=1
//E008:Lack of balance
//1 yuan coin number=1
//2 yuan coin number=0
//5 yuan coin number=0
//10 yuan coin number=0
//E008:Lack of balance
//E008:Lack of balance
//E009:Work failure
//E010:Parameter error
//S002:Pay success,balance=5
public static int []money = new int[5];
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
String str[] = sc.nextLine().split(";");
// r 22-18-21-21-7-20 3-23-10-6;c;q0;p 1;b A6;c;b A5;b A1;c;q1;p 5;
// 0 1 2 3 4 5 6 7 8 9 10
//r A1 数量 -A2 数量 -A3 数量 -A4 数量 -A5 数量 -A6 数量 1 元张数 -2 元张数 -5 元张数 -10 元张数
int []shuliang = new int[7];
shuliang[0] = -1;
int []danjia = { 0, 2,3,4,5,8,6};
String initial[] = str[0].split(" ");
String shuliangStr[] = initial[1].split("-");
String moneyStr[] = initial[2].split("-");
ArrayList<String> list = new ArrayList<>();
//商品数量初始化
shuliang[0] = 0;
for (int i = 1; i <= 6; i++)
{
shuliang[i] = Integer.parseInt(shuliangStr[i-1]);
}
//钱的张数初始化
for (int i = 1; i <=4 ; i++)
{
money[i] = Integer.parseInt(moneyStr[i-1]);
}
list.add("S001:Initialization is successful");
int toubi = 0;
for (int i = 1; i < str.length; i++)
{
switch (str[i].charAt(0))
{
case 'p':
String []p = str[i].split(" ");
int cur = Integer.parseInt(p[1]);
if(cur !=1 && cur !=2 && cur !=5 && cur !=10 )
{
list.add("E002:Denomination error");
break;
}
if( cur !=1 && cur !=2 && money[1]+money[2]*2 < cur )
{
list.add("E003:Change is not enough, pay fail");
break;
}
if ( shuliang[1] == 0 && shuliang[2] == 0 && shuliang[3] == 0
&& shuliang[4] == 0 && shuliang[5] == 0 && shuliang[6] == 0 )
{
list.add("E005:All the goods sold out");
break;
}
toubi += cur;
//易错: 投币后要对钱币张数进行维护
switch (cur)
{
case 1:
money[1]++;
break;
case 2:
money[2]++;
break;
case 5:
money[3]++;
break;
case 10:
money[4]++;
break;
}
list.add("S002:Pay success,balance="+ toubi);
break;
case 'b':
String []buy = str[i].split(" ");
int index = Integer.parseInt( buy[1].substring(1) );
if( !buy[1].equals("A1") && !buy[1].equals("A2") && !buy[1].equals("A3")
&& !buy[1].equals("A4") && !buy[1].equals("A5") && !buy[1].equals("A6") )
{
list.add("E006:Goods does not exist");
break;
}
if(shuliang[index] ==0)
{
list.add("E007:The goods sold out");
break;
}
if( toubi < danjia[index])
{
list.add("E008:Lack of balance");
break;
}
//toubi 表示余额, 全局都是需要维护的
toubi -= danjia[index];
list.add("S003:Buy success,balance=" + toubi);
break;
case 'c':
if(toubi == 0)
{
list.add("E009:Work failure");
break;
}
else if(toubi > 0)
{
int []tuibi = FuncTuibi(toubi);
int []jine = new int[]{0,1,2,5,10};
//1 yuan coin number=0
for (int j = 1; j <= 4 ; j++)
{
list.add(jine[j] + " yuan coin number=" + tuibi[j]);
}
toubi = 0;
break;
}
break;
case 'q':
//对非法输入的处理
if( str[i].indexOf(" ") == -1 )
{
list.add("E010:Parameter error");
break;
}
String []chaxun = str[i].split(" ");
if( !chaxun[1].equals("0") && !chaxun[1].equals("1"))
{
list.add("E010:Parameter error");
break;
}
if(chaxun[1].equals("1"))
{
list.add("1 yuan coin number="+money[1]);
list.add("2 yuan coin number="+money[2]);
list.add("5 yuan coin number="+money[3]);
list.add("10 yuan coin number="+money[4]);
break;
}
int [][] good = new int[7][2];
for (int j = 0; j < 7; j++)
{
good[j][0] = j;
good[j][1] = shuliang[j];
}
//用Arrays.sort() 对二维数组的行进行稳定排序
Arrays.sort(good, new Comparator<int[]>()
{
@Override
public int compare(int[] o1, int[] o2)
{
return o2[0] - o1[0];
}
});
for (int j = 6; j >=0; j--)
{
int index1 = good[j][0];
// A1 2 6
if(index1 == 0)
{
continue;
}
list.add("A"+index1 + " " + danjia[index1] + " " + shuliang[index1]);
}
break;
}
}
for(String i: list)
{
System.out.println(i);
}
}
//贪心算法实现最少张数退币
public static int[] FuncTuibi( int toubi )
{
int []tuibi = new int[5];
Arrays.fill(tuibi,0);
int []jine = {0,1,2,5,10};
for (int i = 4; i >0 ; i--)
{
int shuliang = toubi/jine[i];
if(shuliang == 0)
{
continue;
}
if(money[i] >= shuliang)
{
tuibi[i] = shuliang;
money[i] = money[i] - shuliang;
toubi -= shuliang * jine[i];
}
else if( money[i] < shuliang )
{
tuibi[i] = money[i];
money[i] = 0;
toubi -= money[i] * jine[i];
}
}
return tuibi;
}
}
华为机试题解 文章被收录于专栏
华为机试题解
查看25道真题和解析