我试图找到出现奇数时间的整数,但不知何故,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;
}
}
我需要了解几件事情。检查整数列表中所有元素的最佳方法是什么,并迭代以查看是否存在任何类似元素,如果是,则返回该元素。
答案 0 :(得分:1)
如果您被允许使用java 8,则可以使用streams
和collectors
:
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);