当前位置: 首页 > 知识库问答 >
问题:

如何有效地在具有可包含重复值的约束的贴图中查找最高值的最低关键点?

赵飞雨
2023-03-14

我的怀疑是因为这个问题:

https://www.hackerrank.com/challenges/migratory-birds/problem?h_r=next-挑战

我知道可以通过以下方式轻松解决:

>

  • 将频率存储在Map中
  • 初始化两个温度变量a、b
  • 启动循环

     - Store the current max value & key to a,b
     - If we find similar value: store the lowest key pair to b.
    

    输入arr包含11个值,1 2 2 2 3 4 5 4 3 4

    输出应该是2

    说明1

    不同类型的鸟类以以下频率出现:

    • 类型1:1
    • 类型2:3
    • 类型3:2
    • 类型4:3
    • 类型5:2

    两种类型的频率为3,其中较低的为类型2

    我尝试了下面的代码,但我不知道如何工作。我使用了一个max函数,希望我会得到一个错误,因为我的示例中有两个最大值为3的值。

    但是看一下我使用Collections.max时使用的迁移鸟()函数,查询返回给我的是具有最高值的最低键的映射条目。

    import java.io.*;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Stream;
    
    import static java.util.stream.Collectors.toList;
    
    public class Solution{
    
        // Complete the migratoryBirds function below.
        static int migratoryBirds(List<Integer> arr) {
            Map<Integer,Integer> map = new HashMap<>();
            int temp=0;
            for(int val : arr){
                if(map.containsKey(val)){
                    temp=map.get(val);
                    map.put(val,temp+1);
                }else{
                    map.put(val,1);
                }
            }
            Map.Entry<Integer,Integer> maxEntry = Collections.max(map.entrySet(),
                    (e1, e2) -> e1.getValue().compareTo(e2.getValue()));
            return maxEntry.getKey();
        }
    
        public static void main(String[] args) throws IOException {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));
    
            int arrCount = Integer.parseInt(bufferedReader.readLine().trim());
    
            List<Integer> arr = Stream.of(bufferedReader.readLine().replaceAll("\\s+$", "").split(" "))
                    .map(Integer::parseInt)
                    .collect(toList());
    
            int result = migratoryBirds(arr);
    
            bufferedWriter.write(String.valueOf(result));
            bufferedWriter.newLine();
    
            bufferedReader.close();
            bufferedWriter.close();
        }
    }
    

    有人能解释一下为什么我得到了预期的结果,并建议使用地图流的适当替代方法吗。

    对不起,如果我的问题很奇怪,我喜欢看所有可能的方式。

  • 共有2个答案

    通安宁
    2023-03-14

    将它们分组在id上创建一个地图id-

    Stream.of(1, 2, 2, 2, 3, 4, 5, 5, 4, 3, 4 )
    .collect(groupingBy(identity(), TreeMap::new, counting()))
    .entrySet()
    .stream()
    .max(Map.Entry.comparingByValue())
    .map(Map.Entry::getKey).get();
    
    刘弘济
    2023-03-14

    你可以利用的是:

    int minKeyWithMaxValueEntry = map.entrySet()
            .stream()
            .collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey, 
                    Integer::min, TreeMap::new))
            .lastEntry()
            .getValue();
    

    要详细说明收集操作:

    >

  • 它将初始地图条目中的值存储为键,相应地,条目中的每个键都转换为结果地图的值。

    由于可能有多个键具有相同的值,因此合并函数会选择其中的最小值。

    所有这些都存储在TreeMap中,以确保结果Map对其键进行排序

    其中,选择最后一个条目(初始贴图中的最大值),并将最终贴图中的值存储为输出。

  •  类似资料:
    • 在这个文件数组中,我必须找到最近创建的文件。我是否必须更改日期的格式,或者函数是否可以按原样使用它?

    • 本文向大家介绍查找MongoDB中重复的Name值的最高分?,包括了查找MongoDB中重复的Name值的最高分?的使用技巧和注意事项,需要的朋友参考一下 若要查找最大分数,请使用GROUP()将集合中的文档分组。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是查找最大值的查询。这将计算出重复名称值的最高得分,例如“ Chris”和“ D

    • 问题内容: 我尝试在执行以下命令后获得具有最高/最低编号的行: 这是我的测试数据 为了获得最低的价值,我将使用 现在,id是,但应该是。 我也尝试了加入: 如何根据最低的结果为每个结果获取正确的ID ? 问题答案: 我认为这是您要实现的目标: 输出: ID 价值 姓名 1个 10 第1行 4 5 第2行 在这里,我使用minVal和Name自联接了表。

    • 我很难理解下面的代码是如何在字典中找到最大值的键的。我知道第一个参数返回键列表。但我没有得到第二个参数..帮帮我

    • 问题内容: 我有下表: 如何在每个“班级”中找到最大“分数”的“名称”? 要求的输出: 这是针对MySQL的。 问题答案:

    • 问题内容: 我有一些键指向相同值的哈希图。我想找到所有相等的值并打印相应的键。 这是我目前的代码: 当前代码将重复项两次添加到列表中,但是也会将每个键一次添加一次。 谢谢。 问题答案: 您可以使用流以这种方式检索重复项: 然后,您可以使用以下命令将其打印出来: