给定一个数组,找到在Java中出现奇数次数的整数。

时间:2018-04-21 06:38:42

标签: java list

我试图找到出现奇数时间的整数,但不知何故,qualified.io上的测试没有返回true。我的逻辑可能有问题吗?

问题是在数组[5,1,1,5,2,2,5]中数字5出现3次,因此答案是5.方法签名要我使用List<>。所以我的代码如下。

public static List<Integer> findOdd( List<Integer> integers ) {

    int temp = integers.size();

        if (integers.size() % 2 == 0) {
            //Do something here.
        }
    return integers;
    }
}

我需要了解几件事情。检查整数列表中所有元素的最佳方法是什么,并迭代以查看是否存在任何类似元素,如果是,则返回该元素。

4 个答案:

答案 0 :(得分:1)

如果您被允许使用java 8,则可以使用streamscollectors

Map<Integer, Long> collect = list.stream()
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

给定带有整数的list,此代码将生成一个映射,其中键是实际数字,值是重复次数。

你只需要遍历地图并找出你感兴趣的内容。

答案 1 :(得分:0)

您想要设置一个数据结构,让您计算列表中显示的每个整数。然后遍历您的列表并进行计数。完成后,检查数据结构中是否出现奇数次的整数,并将它们添加到列表中以便返回。

类似的东西:

public static List<Integer> findOdd(List<Integer> integers) {
    Map<Integer, MutableInt> occurrences = new HashMap<>(); // Count occurrences of each integer
    for (Integer i : integers) {
        if (occurrences.containsKey(i)) {
            occurrences.get(i).increment();
        } else {
            occurrences.put(i, new MutableInt(1));
        }
    }
    List<Integer> answer = new ArrayList<>();
    for (Integer i : occurrences.keySet()) {
        if ((occurrences.get(i) % 2) == 1) { // It's odd
            answer.add(i)
        }
    }
    return answer;
}

MutableInt是一个Apache Commons类。您可以使用普通Integers执行此操作,但每次都必须替换该值。

如果您在将上面的答案的后半部分(奇数检查)更改为以下内容之前遇到过流:

return occurrences.entrySet().stream()
         .filter(i -> i % 2 == 1)
         .collect(Collectors.toList());

注意:我自己没有编译任何这些,所以你可能需要调整一下。

答案 2 :(得分:0)

int findOdd(int[] nums) {
  Map<Integer, Boolean>evenNumbers = new HashMap<>();
  nums.forEach(num -> {
    Boolean status = evenNumbers.get(num);
    if(status == null) {
      evenNumbers.put(num, false);
    }else{
      evenNumbers.put(num, !status);
    }
  });
  // Map holds true for all values with even occurrences
  Iterator<Integer> it = evenNumbers.keySet().iterator();
  while(it.hasNext()){
    Integer key = it.next();
    Boolean next = evenNumbers.get(key);
    if(next == false){
      return key;
    }
  }
}

答案 3 :(得分:0)

您可以使用 IntStream 包中的 reduce 方法。

示例:

stream(ints).reduce(0, (x, y) -> x ^ y);