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
我要获取数组中重复出现的数字,因此代码输出错误。
答案 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()得到满足,并且该数字被检测为重复。