Java 大小为2N的数组中的N个重复元素

Java 大小为2N的数组中的N个重复元素,java,Java,在大小为2N的数组A中,存在N+1唯一元素,并且这些元素中正好有一个重复N次 返回重复N次的元素 我试图解决这个算法,但我似乎不明白为什么我的计数总是被重置。任何意见都将受到赞赏 public class RepeatedElementInSize2NArray { public static void main(String[] args) { int[] inputArr = new int[] {1,2,3,3}; int repeatedElem

在大小为
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;

    }

}
公共类RepeatedElementInSize2NArray{
公共静态void main(字符串[]args){
int[]inputArr=新的int[]{1,2,3,3};
int repeatedElement=findRepeatedElement(inputArr);
System.out.println(“重复元素:+repeatedElement”);
}
公共静态int findRepeatedElement(int[]inputArr){
Map repeatedElementMap=newhashmap();
整数计数=0;
for(int i=0;i
它应该是
++count
而不是
count++
行中的
repeatedElementMap.put(inputArr[i],count++)

原因是后者在增加值之前首先返回count的值,而前者先增加值然后返回。

应该是
++count
,而不是
repeatedElementMap.put(inputArr[i],count++)行中的
count++

原因是后者在增加值之前首先返回count的值,而前者先增加值,然后返回。

问题在于行
repeatedElementMap.put(inputArr[i],count++)

表达式
count++
将增加count的值,但返回count的旧值

因此代码
repeatedElementMap.put(inputArr[i],count++)也可以这样编写:

repeatedElementMap.put(inputArr[i], count);
count += 1;
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;
    }
}
效果是一样的,但是在第二段代码中,您清楚地看到了一个问题

解决方案

像这样替换行:
repeatedElementMap.put(inputArr[i],count+1)

编辑

与评论中提到的azurefrog一样,重复元素的查找也存在另一个问题:

在最后一个if语句中,搜索包含的值,如果找到该值,则尝试获取元素。但是get方法搜索的是一个键,而不是一个值。我也不明白为什么用模2代替除以2。更好的方法是只运行条目并搜索一个具有搜索的元素数的条目,如下所示:

repeatedElementMap.put(inputArr[i], count);
count += 1;
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;
    }
}
for(Map.Entry:repeatedElementMap.entrySet()){
if(entry.getValue()==length/2){
repeatedElement=entry.getKey();
}
}
因此,完整的工作代码如下所示:

repeatedElementMap.put(inputArr[i], count);
count += 1;
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;
    }
}
import java.util.HashMap;
导入java.util.Map;
公开课考试{
公共静态void main(字符串[]args){
int[]inputArr=新的int[]{1,2,3,3};
int repeatedElement=findRepeatedElement(inputArr);
System.out.println(“重复元素:+repeatedElement”);
}
公共静态int findRepeatedElement(int[]inputArr){
Map repeatedElementMap=newhashmap();
整数计数=0;
for(int i=0;i
问题出在行
repeatedElementMap.put(inputArr[i],count++)

表达式
count++
将增加count的值,但返回count的旧值

因此代码
repeatedElementMap.put(inputArr[i],count++)也可以这样编写:

repeatedElementMap.put(inputArr[i], count);
count += 1;
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;
    }
}
效果是一样的,但是在第二段代码中,您清楚地看到了一个问题

解决方案

像这样替换行:
repeatedElementMap.put(inputArr[i],count+1)

编辑

与评论中提到的azurefrog一样,重复元素的查找也存在另一个问题:

在最后一个if语句中,搜索包含的值,如果找到该值,则尝试获取元素。但是get方法搜索的是一个键,而不是一个值。我也不明白为什么用模2代替除以2。更好的方法是只运行条目并搜索一个具有搜索的元素数的条目,如下所示:

repeatedElementMap.put(inputArr[i], count);
count += 1;
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;
    }
}
for(Map.Entry:repeatedElementMap.entrySet()){
if(entry.getValue()==length/2){
repeatedElement=entry.getKey();
}
}
因此,完整的工作代码如下所示:

repeatedElementMap.put(inputArr[i], count);
count += 1;
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;
    }
}
import java.util.HashMap;
导入java.util.Map;
公开课考试{
公共静态void main(字符串[]args){
int[]inputArr=新的int[]{1,2,3,3};
int repeatedElement=findRepeatedElement(inputArr);
System.out.println(“重复元素:+repeatedElement”);
}