給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 1:
輸入: [2,2,1]
輸出: 1
示例 2:
輸入: [4,1,2,1,2]
輸出: 4
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/single-number
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
拓展:異或操作
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b兩個值不相同,則異或結果爲1。如果a、b兩個值相同,異或結果爲0。
異或也叫半加運算,其運算法則相當於不帶進位的二進制加法:二進制下用1表示真,0表示假,則異或的運算法則爲:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同爲0,異爲1),這些法則與加法是相同的,只是不帶進位,所以異或常被認作不進位加法。
/**
給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
*/
#include <stdio.h>
/**
分析:線性時間且無額外空間:
一、先排序再處理:時間複雜度空間複雜度無法滿足要求
二、異或
相同的兩個數異或之後,結果爲 0。
任何數與0異或運算,其結果不變。
異或運算支持結合律。
*/
int singleNumber(int* nums, int numsSize){
int tmp = 0;
for(int i =0; i< numsSize;++i){
tmp ^= nums[i];
}
return tmp;
}
int main(void){
int arr[3] = {1,2,1};
int len = 3;
int result = singleNumber(arr,len);
printf("%d",result);
return 0;
}