在大小为2N
的数组A中,存在N+1
个唯一元素,并且恰好这些元素之一重复了N
次。
返回元素重复N
次。
我正在尝试解决此算法,但似乎无法弄清楚为什么我的计数一直在重置。任何输入将不胜感激。
public class RepeatedElementInSize2NArray {
public static void main(String[] args) {
int[] inputArr = new int[] {1,2,3,3};
int repeatedElement = findRepeatedElement(inputArr);
System.out.println("Repeated element : "+repeatedElement);
}
public static int findRepeatedElement(int[] inputArr) {
Map<Integer, Integer> repeatedElementMap = new HashMap<Integer, Integer>();
int count = 0;
for (int i = 0; i < inputArr.length; i++) {
if (repeatedElementMap.containsKey(inputArr[i])) {
count = repeatedElementMap.get(inputArr[i]);
repeatedElementMap.put(inputArr[i], count++);
} else {
repeatedElementMap.put(inputArr[i], 1);
}
}
int length = inputArr.length;
int repeatedElement = 0;
if (repeatedElementMap.containsValue(length % 2)) {
repeatedElement = repeatedElementMap.get(length % 2);
}
return repeatedElement;
}
}
答案 0 :(得分:1)
它应该是++count
而不是count++
行中的repeatedElementMap.put(inputArr[i], count++);
原因是后者在递增值之前先返回count的值,而前者先递增值然后返回。
答案 1 :(得分:1)
问题出在repeatedElementMap.put(inputArr[i], count++);
表达式count++
将增加count的值,但返回count的旧值。
因此,代码repeatedElementMap.put(inputArr[i], count++);
也可以这样写:
repeatedElementMap.put(inputArr[i], count);
count += 1;
效果是一样的,但是在第二个代码中,您清楚地看到了问题。
解决方案:
像这样替换行:repeatedElementMap.put(inputArr[i], count + 1);
修改
就像评论中提到的azurefrog一样,重复元素的查找还有另一个问题:
在最后一个if语句中搜索包含值,如果找到该值,则尝试获取该元素。但是get方法搜索键,而不是值。另外我也不是很清楚为什么使用模2而不是除以2。一种更好的方法是只遍历所有条目并搜索具有以下搜索元素数量的条目:
for (Map.Entry<Integer, Integer> entry : repeatedElementMap.entrySet()) {
if (entry.getValue() == length / 2) {
repeatedElement = entry.getKey();
}
}
因此完整的工作代码如下:
import java.util.HashMap;
import java.util.Map;
public class test {
public static void main(String[] args) {
int[] inputArr = new int[] {1, 2, 3, 3};
int repeatedElement = findRepeatedElement(inputArr);
System.out.println("Repeated element : " + repeatedElement);
}
public static int findRepeatedElement(int[] inputArr) {
Map<Integer, Integer> repeatedElementMap = new HashMap<Integer, Integer>();
int count = 0;
for (int i = 0; i < inputArr.length; i++) {
if (repeatedElementMap.containsKey(inputArr[i])) {
count = repeatedElementMap.get(inputArr[i]);
repeatedElementMap.put(inputArr[i], count+1);
}
else {
repeatedElementMap.put(inputArr[i], 1);
}
}
int length = inputArr.length;
int repeatedElement = 0;
for (Map.Entry<Integer, Integer> entry : repeatedElementMap.entrySet()) {
if (entry.getValue() == length / 2) {
repeatedElement = entry.getKey();
}
}
return repeatedElement;
}
}
答案 2 :(得分:0)
count++
是后递增的,这意味着您插入到哈希图中的值是count
的值,然后count
被递增。
++count
是预先增加的。由于count + 1
是预先增加的,因此您插入到哈希图中的值为count
。
在这种情况下,您当然希望预先增加。您的问题在于,由于要进行后递增操作,所以您永远都不要在哈希图中插入比初始插入的1
大的值。
但是,老实说,根本不需要更新count
,因为它只是哈希图中值的临时变量。取而代之的是,
repeatedElementMap.put(inputArr[i], count + 1);