1. 程式人生 > 實用技巧 >136. 只出現一次的數字

136. 只出現一次的數字

一、題目

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

說明:

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

示例 1:

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

示例 2:

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

二、題解

1. 異或

class Solution {
    public int singleNumber(int[] nums) {
    
        int result = 0;

        for (int i = 0; i < nums.length; i++) {
            result ^= nums[i];
        }

        return result;
    }
}
  • 不需要額外的空間是指的演算法的空間複雜度為O(1)級別

  • 異或運算滿足交換律

  • 任何數異或0都是原數——0^A=A

    • result = 0;
      result ^ 2 = 2;
      
  • 兩個相同的數異或為0——A^A=0

    • 2 ^ 2 = 0;
      
  • 因此一個數字異或同一個數兩次還是原數——ABB=A

    • result = 2;
      2 ^ 2 = 0;
      0 ^ 2 = 2;
      

2. 先排序後比較

class Solution {
    public int singleNumber(int[] nums) {
              
        //氣泡排序
        int temp = 0;  
        for (int i = 0; i < nums.length-1; i++){
            for (int j = 0; j < nums.length-1; j++) {
                if (nums[j]>nums[j+1]) {
                    temp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = temp;
                }
            }
        }

        //兩兩比較,不一樣就跳出迴圈輸出那個數
        temp = nums[0];
        for (int i = 0; i < nums.length-2; i+=2) {
            if(temp==nums[i+1]){
                temp = nums[i+2];
            }else {
                break;
            }
        }
        return temp;
    }
}