买不买——HashMap

解题思路:

(1)统计商家的不同颜色珠子的数量。

HashMap p--2/R--2/Y--3/G--1/r--2/B--1/2--2/5--1/8--1    

(2)统计小红的不同颜色珠子的数量。

HashMap       /R--2/Y--2         /r--2                      /8--1

(3)用小红的不同颜色珠子的数量与商家的进行比较(以小红手中珠子为参考)。

  • 商家的珠子包含小红的珠子 。

       Yes   多的珠子数=商家的珠子数量-小红的珠子数量

  • 商家的珠子不包含小红的珠子

        情况一:商家没有小红手上类型的珠子。  

        情况二:商家有小红要的类型的珠子,但是数量不够。

       No   缺的珠子数=缺的那种类型的珠子数 + 有所需类型的珠子与实际所有的珠子的差值

测试实例:

输入:商家:ppRYYGrrYBR2258   小红:YrR8RrY 
输出:Yes 8

涉及知识:

   HashMap

难点理解:

for (Entry<Character, Integer> en : n.entrySet()) { //遍历小红珠子对象的集合
    char k = en.getKey(); // 小红珠子的种类
    int v = en.getValue();// 小红珠子的数量
    //h.get(k),根据珠子的种类获取其数量
    if (h.containsKey(k) && h.get(k) < v) {//商人的珠子包含用户的珠子但是不够
        Result = false;
        lack += v - h.get(k);//计算差值: lack=lack+v-h.get(k);
    } else if (!h.containsKey(k)) {//商人的珠子不包含用户的珠子
        Result = false;
        lack += v;
    }
}

实现代码:

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;

public class Beads {
        public static void main (String[] args) {
            Scanner sc = new Scanner(System.in);

            //商人输入
            System.out.println("请输入商家珠子:");
            String have = sc.nextLine();
            //小红输入
            System.out.println("请输入小红珠子:");
            String need = sc.nextLine();

            //商人手上每种珠子数量的统计(对珠子进行分类)
            Map<Character, Integer> h = new HashMap<>();
            for(char c : have.toCharArray()) {
                if(h.containsKey(c)) {
                    h.put(c, h.get(c)+1);
                }else {
                    h.put(c,1);
                }
            }

            //小红手上每种珠子数量的统计(对珠子进行分类)
            Map<Character, Integer> n = new HashMap<>();
            for (char c : need.toCharArray()) {
                if (n.containsKey(c)) {
                    n.put(c, n.get(c) + 1);
                } else {
                    n.put(c, 1);
                }
            }

            //计算差值,以小红珠子为参考
            boolean Result = true;
            int lack = 0;
            for (Entry<Character, Integer> en : n.entrySet()) { //遍历小红珠子对象的集合
                char k = en.getKey(); // 小红珠子的种类
                int v = en.getValue();// 小红珠子的数量
                //h.get(k),根据珠子的种类获取其数量
                if (h.containsKey(k) && h.get(k) < v) {//商人的珠子包含用户的珠子但是不够
                    Result = false;
                    lack += v - h.get(k);//计算差值: lack=lack+v-h.get(k);
                } else if (!h.containsKey(k)) {//商人的珠子不包含用户的珠子
                    Result = false;
                    lack += v;
                }
            }

            if (Result){
                System.out.println("Yes " + (have.length() - need.length()));//商家的珠子包含小红的珠子
            } else {
                System.out.println("No " + lack);
            }
        }
    }

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值