leetcode.136 只出現一次的數字I

題目描述:

給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

說明:

你的算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 1:

輸入: [2,2,1]
輸出: 1

示例 2:

輸入: [4,1,2,1,2]
輸出: 4

方法一(^異或運算符)

異或運算符在兩個相等運算符之間運算結果爲0,例如4^4=0,4^0=4.

根據異或運算符的提點,所有出現兩次的數字最後的運算結構都爲0,只有出現一次的數字與0運算結果是本身。

代碼如下:

public static int singleNumber(int[] nums) {
         int num = 0;
         for (int i = 0; i < nums.length; i++) {
             num = num ^ nums[i];
         }
         return num;
}

方法二(藉助HashSet)

思路:將元素添加到HashSet,在添加之前判斷集合中是否已有該元素,如果有則移除,否則添加。

代碼如下:

public static int singleNumber(int[] nums) {
        HashSet set = new HashSet<Integer>();
        for(int i = 0; i < nums.length; i++){
            if(set.contains(nums[i])) {
            	set.remove(nums[i]);
            }else {
            	set.add(nums[i]);
            }
        }
        int tmp = 0;
        Iterator<Integer> it = set.iterator();
        while(it.hasNext()) {
        	System.out.println(tmp=it.next());
        }
        return tmp;
}

方法三(藉助排序)

思路:先將元素排序,這時數組中相等的元素兩兩相鄰,進行判斷即可。

public static int singleNumber(int[] nums) {
       Arrays.sort(nums);
		for(int i = 0; i < nums.length - 1; i+=2) {
			if(nums[i] != nums[i+1]) {
				return nums[i];
			}
		}
		return nums[nums.length - 1];
}

方法四(暴力法)

思路:按照數組中的順序遍歷元素,進行比較,沒有與選定元素相等的元素則返回。

public static int singleNumber(int[] nums) {
       if(nums.length > 1) {
        for(int i = 0; i < nums.length-1; i++) {
            boolean b = false;
            for(int j = 0; j < nums.length; j ++) {
                if(i == j) continue;
                if(nums[i] == nums[j]) {
                    b = true;
                }        
            }
            if(b == false) return nums[i];
        }
            
            
        }
        return nums[nums.length-1];
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章