有一个长度为n的数组,所有的数字都在0~n-1 里面,找出其中的重复数字
1.使用hashset进行解决,此种方法时间复杂度为O(n) 但是有额外的复杂度。set判断元素是否存在时间为O(1)
遍历整个数组,判断是否存在与于set中,不存在将其放入即可,若存在,即找到了重复数字,跳出循环
public static int findbyhashset(int x[]) {
int re=0;
Set Sset =new HashSet();
for(int i=0;i<x.length;i++) {
if(!Sset.contains(x[i])) {
Sset.add(x[i]);
}
else {
re=x[i];
System.out.println(re);
}
}
return re;
}
2.排序比较,此种方法时间复杂度为O(n),但是不需要额外的空间
可以对数组进行整个遍历,当扫描的下标为i的数字(假定为M) 时若m==i,即扫描下一个,若是比不相等,找到下标为m的数字,如果相等,即为一个相等数字,若不然,则可以将m与下标为m的数字进行交换,扫描下一个
public static void findbycom(int x[]) {
for(int i=0;i<x.length;i++) {
while( x[i]!=i) {
int temp =x[i];
if(x[i]==x[temp]) {
System.out.println(x[i]);
break;
}
else {
int stemp=x[i];
x[i]=x[stemp];
x[stemp]=stemp;
}
}
}
代码运行截图