问题描述:
在一个超市里,有一个包含 nn 个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第 nn 个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。
作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。输入变量说明:
n:货物架的格子数m:顾客想要购买的商品种类数s:货物架上商品的初始顺序c:顾客想要购买的商品种类
对题目初步理解:
超市管理员面临一个货物架管理问题。货物架上有n个格子,每个格子放有一种小写字母a到z表示的商品。顾客会按顺序查找格子,直到找到想要购买的商品、遇到空格子或查完所有格子。管理员可以在顾客到来前调整商品顺序,以最大化售出的商品数量。一旦第一个顾客开始查找,商品顺序就不能再改变。问题要求计算在最优调整下,最多能卖出多少件商品。输入包括货物架的格子数n、顾客想要购买的商品种类数m、货物架上商品的初始顺序s以及顾客想要购买的商品种类c。
解题思路: 1.首先统计商品数量 2.计算最大销售量 3.调整商品顺序
关键点:
·怎么统计商品数量?
·怎么计算最大销售量?
·怎么调整商品顺序?
代码实现:
import java.util.HashMap;
import java.util.Map;
public class Main {
public static int solution(int n, int m, String s, String c) {
int count=0; //后续算次数
//用两个hashmap去储存它,返回同一个值中较小的值
char[] ch1 = s.toCharArray();
char[] ch2 = c.toCharArray();
//HashMap使用
HashMap<Character,Integer> map1=new HashMap<>();
HashMap<Character,Integer> map2=new HashMap<>();
//开始遍历
for (char ch : ch1) {
map1.put(ch, map1.getOrDefault(ch, 0)+1);
}
for (char ch : ch2) {
map2.put(ch, map2.getOrDefault(ch, 0)+1);
}
for(char i='a';i<='z';i++){
if(map1.keySet().contains(i)&&map2.keySet().contains(i)){
count+=Math.min(map1.get(i), map2.get(i));
}
}
return count;
}
//以下为测试用例
public static void main(String[] args) {
System.out.println(solution(3, 4, "abc", "abcd") == 3);
System.out.println(solution(4, 2, "abbc", "bb") == 2);
System.out.println(solution(5, 4, "bcdea", "abcd") == 4);
}
}
具体分析:
货架和用户分为两个不同的字符串,而货物就是字符串中对应的字符,(此处巧妙运用hashmap,文末将补充相关内容);再而遍历字符串,寻找适合条件的字符;再计算最小出现次数,检查是否同时存在于map1和map2(如果是则证明共有);最后将出现字数累加(相同字符的最小出现次数之和)。
一个(奇奇怪怪的)图:(仅个人想法,如有异议以上方解析为准)
关于HashMap:
1. 定义一个哈希表
HashMap<Integer, String> hashmap= new HashMap<Integer, String>();
2.增
hashmap.put(1, "string1"); // 执行完后hash表内为{1=string1}
hashmap.put(2, "string2"); // 执行完后hash表内为{1=string1, 2=string2}
hashmap.put(2, "string2"); // 执行完后hash表内为{1=string1, 2=string2, 3=string3}
`
3.删
hashmap.remove(1); // 执行完后hash表内为{2=string2, 3=string3}
hashmap.remove(2); // 执行完后hash表内为{3=string3}
hashmap.remove(3); // 执行完后hash表内为{}
hashmap.clear();// 删除所有键值对
4.查####
hashmap.get(1); // 返回string1
hashmap.get(2); // 返回string2
hashmap.get(3); // 返回string3
5.替换 hashMap 中是指定的key对应的 value
hashmap.replace(key,value); // 返回0
6. 返回hashmap中键值对的数量
hashmap.size(); // 返回0
7.特殊用法
·当Map集合中有这个key时,就使用这个key对应的value值,如果没有就使用默认值defaultValue;
hashmap.getOrDefault(key,defaultValue);
·与 for-each 循环一起使用,用来遍历迭代 HashMap 中每一个映射项
// foreach循环
for(var entry : map.entrySet()){
// 获得key
int key = entry.getKey();
// 获得value
int value = entry.getValue();
}