找出数组中任意重复的数字
思路:找出数组中的任意重复的数字,这里可以先将数组排序,然后就非常方便找出,而且这个方法不需要创建新的空间,空间复杂度为o(1)。但排序的时间复杂度是O(n*n),具体实现如下:
public class paixu { public static void main(String[] args) { int number; System.out.println("请输入想要的数组长度"); number=input.inputnum();//自己封装的输入的类的输入整数的方法 int[] numbers=new int[number]; for(int i=0;i<numbers.length;i++) { numbers[i]=input.inputnum(); } //冒泡排序 for(int j=0;j<numbers.length;j++) { for(int k=j;k<numbers.length-1;k++) { if(numbers[k]>numbers[k+1]) { int temp=numbers[k]; numbers[k]=numbers[k+1]; numbers[k+1]=temp; } } } int flag=0; for( int l=0;l<numbers.length-1;l++) {if(numbers[l]==numbers[l+1]){ flag=1; System.out.println(numbers[l]); break; }} if(flag==0) System.out.println("无任何重复的数字"); }
封装的输入数字的类如下,可以抓到异常,然后重新让用户输入
public class input { public static int inputnum(){ System.out.println("请输入一个数字"); int number=-1; Scanner sc=new Scanner(System.in); try{ number=sc.nextInt(); } catch(Exception e){ System.out.println("格式错误,请输入数字"); number=inputnum(); } return number; } }
但上面的时间复杂度过高,会影响效率,所以我遍历一次数组,将数组中的数字存入Set中,当发现set里有此数时直接退出,这样的话时间复杂度最多为O(n),可以提高效率
public static void main(String[] args) { int number; System.out.println("请输入想要的数组长度"); number=input.inputnum();//自己封装的输入的类的输入整数的方法 int[] numbers=new int[number]; for(int i=0;i<numbers.length;i++) { numbers[i]=input.inputnum(); } Set<Integer> set=new HashSet<Integer>(); boolean flag=true; for(int i=0;i<numbers.length;i++) {if(!set.contains(numbers[i])) set.add(numbers[i]); else{ System.out.println(numbers[i]); flag=false; break; } } if(flag==true) { System.out.println("无重复数字"); } }