1. 程式人生 > >leetcod刷題---只出現一次的數字

leetcod刷題---只出現一次的數字

吐槽

今天刷了兩道題,但是第一道太簡單了就不記錄了,來看下這塊坑了我10分鐘的題233

題目

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

說明:

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

示例 1:

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

示例 2:

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

思路

我自己的解題思路: 看了下題,發現這塊很簡單哇,先給陣列排個序,然後單獨重新的數放置有三種情況討論下

  • 在陣列第一個位置
  • 在陣列最後一個位置
  • 在陣列的中間

第一種和第二種情況,直接就判斷下,看下它的後面和前面是否值相等,不相等的時候,就是它了

第三種情況也很好判斷,因為先是排好序,所以兩個一樣的肯定在一起233,所以判斷下這個數和前面的數一樣不而且再看下和後面的數一樣不,如果都不一樣,那就是這個單身狗了就找到了

//這道題有毒的地方是,測試資料陣列可能只有一個233 我的答案能過,但是發現費時太多233,不是優秀的解法

public int singleNumber(int[] nums) {
    int n = 0;
    int k = nums.length;
    if (k == 1){
        return nums[0];
    }
    Arrays.sort(nums);
    if (nums[0]
!= nums[1]){ n = nums[0]; } if (nums[k-1] != nums[k-2]){ n = nums[k-1]; } if (k > 3){ for (int i = 2;i < k-2;i++){ if ((nums[i] != nums[i+1])&&(nums[i] != nums[i-1])){ n = nums[i]; break; } }
} return n; }

程式碼

真正這道題要考的是異或運算

根據異或運算的特點,相同的數字經過異或運算後結果為0,除單獨出現一次的數字外,其他數字都是出現兩次的,那麼這些數字經過異或運算後結果一定是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;
     }