导读:
输入一组一维数组数据中为[2,2,5,3,5],找出重复数据2,5。(简析:因为这道题很简单但是我做了超出了我预想的时间,所以记录一下)
JAVA代码:
public class repeateDataFind{
private static int repeatNum = 0;
private static boolean flag = false;
public static void main(String[] args){
Scanner s = new Scanner(System.in); //输入流
System.out.print("输入你的数组长度:");
int n = s.nextInt();
int[] stater = new int[n];
for(int i =0 ;i<n;i++){
Scanner word = new Scanner(System.in);
System.out.print("输入你的值"+ i +":");
int data = s.nextInt();
stater[i] = data;
}
System.out.print("输入你的数组为:");
for(int i =0 ;i<n;i++){
System.out.print(stater[i]+" ");
}
System.out.println();
repeatData(stater, n);
}
//寻找重复数
public static void repeatData(int[] numbers, int n){
Set<String> set = new HashSet<String>();//set方法去重
for(int i = 0 ; i < n;i++){
int forcastData = numbers[i];
for(int j = i; j < n-1 ; j++){
if(forcastData == numbers[j+1]){
repeatNum++;
set.add(String.valueOf(forcastData));//转换成字符串
flag = true;
}
}
}
if(flag == true){
System.out.print("重复数据为");
for(String ok : set){
System.out.print(ok + " ");
}
}
else{
System.out.println("sorry,没有重复的数据");
}
}
}
测试图
原理:
repeatData方法就是来寻找数组重复的数据的,这个我自己写的一个方法。一开始我以为需要排序,然后发现排序并不能够减少时间复杂度,只好老老实实的一个一个比较。当然我有想过用类似hadoop分布式来进行分割寻找匹配,但一想还是不能够根本上解决时间复杂度的问题。第二个问题是关于重复数据找到再次去重的问题,比如说数组[2,2,2],那么输出应该就是2,而不是2,2,这里我想到的是用set数据结构去重,set集合有去重功能,下意识转换成字符串来解决了。输出的还是正确的,如果需要再次转换成int就可以了(Integer.valueof()方法来转,Integer自动拆箱成int类型,所以可以用int接收)。