1. 程式人生 > >陣列中重複的數字(Java實現)

陣列中重複的數字(Java實現)

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;
	}
}