解题思路:
(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);
}
}
}