leetcod刷題---只出現一次的數字
阿新 • • 發佈:2018-12-15
吐槽
今天刷了兩道題,但是第一道太簡單了就不記錄了,來看下這塊坑了我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;
}