【问题标题】:Find pair number in an Array在数组中查找对数
【发布时间】:2017-04-13 01:36:39
【问题描述】:

有一个由多个数字组成的数组。其中找出java中的对数(在该数组中包含2次)。假设这个数组中的 {2,5,7,8,2,3,5,6,5} 2 包含 2 次,所以它是对数。

我试过这样:

HashMap<Integer, Integer> hmap = new HashMap<>();
  for (int i = 0; i < arr.length; i++)
    {
        Integer c = hmap.get(arr[i]);
        if (hmap.get(arr[i]) == null)
               hmap.put(arr[i], 1);
        else
          hmap.put(arr[i], ++c);
    }

【问题讨论】:

  • 对数组进行排序,并为每个元素检查下一个元素是否相同
  • 放入地图,根据key保持侵权,用counter=2打印全部
  • 你也可以使用 Map 方法
  • 为什么?它是要求、测试还是考试?你能用什么?最后也是最重要的......你试过什么?请参阅How to Ask

标签: java arrays


【解决方案1】:

你可以使用流

List<Integer> collect = Stream.of(2, 5, 7, 8, 2, 3, 5, 6, 5)
            .collect(Collectors.groupingBy(e -> e)).entrySet().stream()
            .filter(e -> e.getValue().size() == 2).map(Map.Entry::getKey)

【讨论】:

    【解决方案2】:

    使用原始类型的程序

    num[j]= '0'; // 这只是一个占位符

      int []num = {2,5,7,8,2,3,5,6};
            int counter = 0;
            for(int i=0;i<num.length-1;i++){
                for(int j=i+1;j<num.length && num[i]!=0;j++){
                    if(num[i] == num[j]){
                        counter++;
                        num[j]= 0;
                    }
                }
                if(counter==1)
                     System.out.println("pair found for: "+num[i]);
                counter = 0;
            }
    

    【讨论】:

    • 他已经有了找到配对的解决方案。在某些情况下你应该打破循环(如果 num[i] = 0,那么这是一个检查值,跳过它)
    • o/p is : pair found for: 2 pair found for: 5 // 5 在数组中出现了 3 次,那么如何配对?
    • @AxelH 我一开始就打开了问题,当时我没有找到哈希图代码。我忘了刷新浏览器。对不起。我确定了答案
    【解决方案3】:

    我可以想到两种方法。首先,您可以使用映射,在这种方法中,您将获取数组中的每个元素并将其放入映射中,以便每次迭代时都可以检查是否已经将该值插入到映射中。

    第二种方法类似于排序,但是您可以检查数组中的每个元素以及所有以下元素,一旦找到匹配项,您就会返回并退出。这种方法会比我认为的 map 方法慢,但比先排序然后查找相邻值要快。

    【讨论】:

    • 这也是假设只有一对,因为你说“找出这对”
    • check each element in the array with all the following elements and as soon as you find a match you would return and exit 你怎么知道位置 2 的值不等于位置 0 的值,已经检查过了?编辑:是的,你的评论有点回答我的问题^^
    【解决方案4】:

    不发布实​​际代码,将其放入 Map 并查找计数。但是您需要小心检查 2 的计数。它不只是 2,所有 4、6、8 等的计数也会导致配对(我认为到目前为止,这个问题的所有答案和 cmets 都缺乏这一点)。

    【讨论】:

      【解决方案5】:

      从您发布的内容来看,您的代码很好。您有一张地图,其中包含找到的每个值的计数。

      现在,你只需要打印你想要的,

      for(Integer i : hmap.keySet()){
          Integer cnt = hmap.get(i);
          if(cnt > 1)} //or == 2
              System.out.println(i + " -> " + cnt);
          }
      }
      

      而且你对每一对都有一个不错的小输入(如果有更多的话,加上计数),只需更新你的输出。

      【讨论】:

      • 是的,现在我明白了逻辑并且它对我来说工作正常。非常感谢:)
      • @Kaustav 欢迎您,在未来,请考虑从一开始就提供所有信息;);)如果您找到了符合您需要的答案,请不要犹豫接受它(只是亲爱的答案的投票系统)关闭问题。并为您认为有用的每个答案投票。
      • 我会的。谢谢 :)
      • @Kaustav 我只是在阅读您的另一个问题(尽管它已被删除)并查看您的活动,我注意到您仍未将此答案标记为已接受。
      猜你喜欢
      • 2018-03-13
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多