面试算法题:输入金额,输入若干商品价格,买尽可能多的种类商品

4 篇文章 0 订阅
3 篇文章 0 订阅

题目:

小明的女朋友最喜欢在网上买东西,可是钱包里的钞票有限,不能想买啥就买啥。面对琳琅满目的物品,她想买尽可能多的种类,每种只买一件,同时价格不能超过上限。于是 她请小明写程序帮她找出应该买哪些物品,并算出这些物品的总价格。

输入规范:

每个输入包含两行。第一行是预算上限,第二行是用空格分隔的一组数字,代表每种物品的价格,所有的数字都为正整数并且不会超过10000。

输出规范:

对每个输入,输出应买物品的总价格。

输入示例1:

100

50 50

输出示例1:

100

输入示例2:

188

50 42 9 15 105 63 14 30

输出示例:

160

 

解题思路:首先商品的种类不是固定的(可以输入若干商品价格),我采用集合ArrayList来存放商品价格,然后进行从小到大排序,遍历该集合,

如果当前拥有的钱 total 大于该物品价格price,则说明可以购买,

当前的钱减去该商品    价格total = total-price,

总价增加 sum+= price,若当前拥有的钱,小于price,则说明无法购买,跳出循环,打印总价sum。

代码如下:

package com.xuanqi;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Test {
    public static void main(String[] arges) {

        Scanner sc1 = new Scanner(System.in); //输入月份和日期
        Scanner sc2 = new Scanner(System.in); //输入 大写字母字符串
        //接受输入参数
        String m = sc1.nextLine();
        String n = sc2.nextLine();

        List<Integer> prices = new ArrayList<>();

        String temp[] = n.split("\\s+");
        for (String s : temp) {
            Integer price = Integer.parseInt(s);
            if (price != null && price <= 10000 && price > -1) {//判断输入的是否为数字
                prices.add(price);
            }
        }
        Collections.sort(prices); //将输入的价格进行排序

        Integer total = Integer.parseInt(m); //获取输入的预算上限
        Integer sum = 0;
        /**
         * 遍历价格集合,prices是有序的集合,从小到大排列
         *      total 为当前拥有的钱,如果total >= price ,说明可以买此商品,
         *      则total = total - price;
         *      此时,计算总价 sum += price
         *      直到total < price 说明当前拥有的钱不够支付下一个商品,则跳出循环 打印sum总价;
         */
        for (Integer price : prices) {
            if (total >= price) {
                total = total - price;
                sum += price;
            }else{
                break;
            }
        }
        System.out.println(sum);
    }
}
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值