1. 程式人生 > >判斷陣列中是否有重複數字(two ways +位運算)

判斷陣列中是否有重複數字(two ways +位運算)

//判斷陣列中是否有重複的數字,有則返回true,沒有則返回false

//方法一:先用時間複雜度為O(nlogn)的排序將陣列重建,然後遍歷尋找
	
//方法二:新建一個數組型hash表,key存num[i],valu存num[i]出現的次數。時間複雜度為O(n),空間複雜度為O(n)
public static boolean Dup(int[] num){
		int hash[] = new int[num.length + 1];
		for (int i = 0; i < num.length; i ++){
			if (hash[num[i]] == 0){
				hash[num[i]] ++;
			}
			else {
				return true;
			}
		}
		return false;
	}
	
//方法三:整個過程就是將陣列元素值num[i]與i進行對應,比如i = 0, num[i] = 1,num[i] != i,那麼接著判斷num[num[i]]也就是1的位置是否著num[i]即1,如果是,則說明有兩個1,返回true,若不是,則交換num[i]和num[num[i]],讓元素值1在index = 1的位置。時間複雜度為O(n),空間複雜度為O(1)
public static boolean Dup(int[] num){
		for (int i = 0; i < num.length; i ++){
			while (num[i] != i){
				if (num[num[i]] != num[i]){
					int tmp = num[i];
					num[i] = num[tmp];
					num[tmp] = tmp;
				}
				else {
					return true;
				}
			}
		}
		return false;
	}
}
//方法四:(陣列中只有唯一一個single number)要求時間複雜度為O(n),空間複雜度為O(1)
    public static int singleNumber(int[] nums) {
    	int ret = 0;
     	for (int i = 0; i < nums.length; i ++){  
        ret = ret ^ nums[i];    //異或運算,a^b = b^a, 0^a = a.相同的兩個數異或得到0,所以最終得到的是single number
	}
	return ret;
    }