陣列中重複的數字(Java實現)
阿新 • • 發佈:2019-01-23
public class Interview3 { /** * 題目一:找出陣列中重複的數字 * 在一個長度為N的數組裡的所有數字都在0~n-1的範圍內。 * 陣列中某些數字是重複的,但不知道有幾個數字重複了, * 也不知道每個數字重複了幾次。請找出陣列中任意一個重複的數字。 *思路:1、對陣列進行排序,然後遍歷,相同的輸出 * 2、插入到雜湊表中 * 3、與下標進行匹配,交換後,如果都在各自的位置上則沒有重複的,否則就能找出重複的 * * 下面是思路三的實現 */ public static boolean duplicate(int nums[],int n,int []dumpli){ //首先判斷陣列輸入的合法性 boolean result=false; if(nums==null||nums.length<=1||n<=1)return false; for(int i=0;i<n;i++){ if(nums[i]<0||nums[i]>n) return false; } for(int i=0;i<n;i++){ while(nums[i]!=i){ if(nums[i]!=nums[nums[i]]){ int t=nums[i]; nums[i]=nums[nums[i]]; nums[nums[i]]=nums[i]; }else { dumpli[0]=nums[i]; result = true; } } } return result; } /** * 題目二:不修改陣列找出重複的數字 * 在一個長度為n+1的數組裡的所有的數字都在1~n之間, * 所以陣列中至少有一個數字式重複的,請找出陣列中任一個重複的數字, * 但是不能修改輸入的陣列 * 思路:1、放到雜湊表中 * 2、建立一個O(n)的輔助空間,複製到對應的下標下 * 3、二分查詢法 數陣列中1~m的數的個數與m+1~n的數字的個數 * 下面是思路3的實現 */ public static int dumplication(int number[],int n){ //判斷輸入的陣列的合法性 if(number==null||number.length==0)return -1; for(int i=0;i<number.length;i++){ if(number[i]<1||number[i]>n)return -1; } int start=1;int end=n; while(start<=end){ int mid=(start+end)/2; int count=countRange(number,n,start,end); if(end==start){ if(count>1) return start; else break; } if(count>(mid-start+1)) end=mid; else start=mid+1; } return -1; } //統計在特定的區間內的數字的個數,比如陣列中1-7內的數字出現的次數 private static int countRange(int number[],int n,int start,int end){ if(number==null||n<=0) return 0; int count=0; for(int i=0;i<number.length;i++){ if(number[i]>=start&&number[i]<=end)count++; } return count; } }