超市里的货物架调整问题(以及HashMap使用方法)

215 阅读4分钟

问题描述:

在一个超市里,有一个包含 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(如果是则证明共有);最后将出现字数累加(相同字符的最小出现次数之和)。

一个(奇奇怪怪的)图:(仅个人想法,如有异议以上方解析为准)

11.30超市.jpg

关于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();
}