leet136.只出現一次的數

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

說明:

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

示例 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;
}

 

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