美团2023面试题:小美的外卖订单

题目描述
小美正在设计美团外卖的定价信息。已知外卖定价的规则如下:
  1. 每道菜有折扣价和原价。折扣价不能超过原价。
  2. 订单有满x元减y元的优惠。当购买的菜的价格总和不小于x元时,总价格可以减y元。“减”的价格不能超过“满”的价格。
  3. 满减优惠和折扣价是互斥的,当且仅当每个菜都选择了原价才可以触发满减。
  4. 系统会自动为客户计算最低价格的方案。
在设计定价时,原价、折扣价和满减的价格都必须是正实数。如果设计的定价发生问题,则会提示数据错误。 请使用等价划分法设计测试用例,来测试该系统的功能。
输入描述1

第一行输入一个正整数n代表菜的总数。
接下来的n行,每行输入两个实数a和b,代表每道菜的原价是a,折扣价是b。
最后一行输入两个实数x和y,代表满x元可以减y元。

数据中所有实数的绝对值不超过1000。

输出描述2
如果数据有误,则输出一行字符串"error"。 否则输出一个小数,小数点后保留2位即可。该小数代表顾客购买了全部菜各一份时,订单的总价格。
示例1
输入例子:
2
10 5.5
10 6.5
15 3
输出例子:12.00
例子说明:虽然触发了满15元减3元,但使用折扣只需要花12元,低于使用满减的价格(20-3=17),因此最终系统会为客户推荐折扣价。
示例2
输入例子:
2
10 5.5
10 6.5
20 10
输出例子: 10.00
例子说明: 触发满20元减10元即可。满减价优于折扣价。
示例3
输入例子:
2
10 10.25
10 3.5
20 4.5
输出例子:error
例子说明:折扣价高于原价,数据错误。
AC代码:
public class main {
    public static void main(String[] args) {
        DecimalFormat decimalFormat = new DecimalFormat();
        //DecimalFormat类用于格式化BigDecimal的,这里保留两位小数
        decimalFormat.applyPattern("0.00");

        //商品原价总价
        BigDecimal originPrice = new BigDecimal(0);
        //商品原价原计划折后总价
        BigDecimal savePrice = new BigDecimal(0);
        //满减门槛价格
        BigDecimal top = new BigDecimal(0);
        //将满减价格
        BigDecimal save = new BigDecimal(0);

        boolean flag = true;

        Scanner in = new Scanner(System.in);
        Float num = in.nextFloat();
        while (num>=0 && in.hasNextFloat()) {
            BigDecimal a = new BigDecimal(in.nextFloat());
            BigDecimal b = new BigDecimal(in.nextFloat());
            /**
             * 输出false情况有三种
             * 1、某一项菜品原计划折后总价=0
             * 2、某一项菜品原计划折后总价>它的原价
             * 3、某一项菜品源计划折后总价=它的原价
             */
            if(b.compareTo(new BigDecimal(0))==-1 || b.compareTo(a)==1 || b.compareTo(new BigDecimal(0))==0){
                flag = false;
            }
            //记录最后一行输入(满减门槛价格、将满减价格)
            if(num == 0){
                top = a;
                save = b;
            }else{
                //如果不是最后一行则累加数据
                originPrice = originPrice.add(a);
                savePrice = savePrice.add(b);
            }
            num--;
        }
        /* 如果输入信息合法就计算哪一种满减合适
            1、判断原价是否达到满减门槛(原价总价=门槛价 || 原价总价大于门槛价)
            1.2、三目运算判断原价折后总价和满减折后总价哪个划算
           如果输入信息不合法
            :输出error
         */
        if(flag){
            if(originPrice.compareTo(top)==1 || originPrice.compareTo(top)==0){
                BigDecimal bigDecimal = savePrice.compareTo(originPrice.subtract(save))==1 ? (originPrice.subtract(save)) : savePrice;
                System.out.println(decimalFormat.format(bigDecimal));

            }else{
                System.out.println(decimalFormat.format(savePrice));
            }
        }else{
            System.out.println("error");
        }
    }
    /**
     * 简单快速拓展一下DecimalFormat的使用:
     * BigDecimal a = new BigDecimal(10.0);
     * BigDecimal b = new BigDecimal(2.53);
     * log.info(String.valueOf(a.add(b)),"加");
     * log.info(String.valueOf(a.subtract(b)),"减");
     * log.info(String.valueOf(a.multiply(b)),"乘");
     * log.info(String.valueOf(a.divide(b,4, RoundingMode.HALF_UP)),"除");
     */
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值