在获取数组中的重复数字时出现错误

时间:2019-04-20 16:14:21

标签: java

package interview;

import java.lang.reflect.Array;
import java.util.*;

public class multiple {

    public static void main(String[] args) {

    int arr[] =  { 2, 4 ,1, 6,4, 5 , 40 , -1};
    //int i =arr.length;
    //System.out.println(i);

    for(int i=0; i<(arr.length) ; i++)
    {
        for(int j=1; j<(arr.length) ; j++)

        {
            if(arr[i] ==arr[j])
            {
                System.out.println(arr[i]);

        }

        }

    }

输出:

4
4
1
6
4
4
5
40
-1

我要获取数组中重复出现的数字,因此代码输出错误。

2 个答案:

答案 0 :(得分:3)

您应该从i + 1到以下内容开始内循环:

for (int j = i + 1; j < arr.length; j++)

否则,您将开始比较先前迭代中已经比较过的对象

请注意,这是您要解决的问题的次佳方法。

答案 1 :(得分:1)

在您的解决方案中,j的值始终在索引1处保持不变,并且i不断变化,因此对于前几次迭代而言,比较将是正确的。

但是一旦i大于j,我们将在输出中看到多余的内容,因为它们已经过比较和考虑。因此,j的值必须比i的值(动态)大1,以便不进行额外的比较。

只是为了减少o(n 2 )的复杂性,我们可以使用以下方法:

Set<Integer> uniqueSet = new HashSet<>();
for(int i =0; i< arr.length; i++){
     if(!uniqueSet.add(arr[i])){
         System.out.println(arr[i]);
     }
}

我们正在将数字添加到HashSet中,如果数字不存在,add方法将返回true并且if()条件不满足,但是如果已经在HashSet中添加了数字,则add将返回false,因此if()得到满足,并且该数字被检测为重复。