[Leetcode 136] Single Number

原題:

Given an array of integers, every element appears twice except for one. Find that single one.

Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

題目分析:
這題意思就是給定一個數組,每個元素都出現兩次,但有一個元素只出現一次,找出這個元素。

如果不是題目的限制,不給使用額外空間,這題思路還是很廣闊的。但是這題不給使用額外空間,在知乎看leetcode 中有哪些題的解法讓你拍案叫絕?
有人也提到了這題,使用了XOR,其實說來也巧,做這道題之前,正在看《深入理解計算機系統》
正好說運算符部分就提到了^運算符。
運算規則,和自己相同的數值異或運算爲0,不同的爲1。

0 0 0
0 1 1
1 0 1
1 1 0

a^a = 0
a^0 = a
不使用中間變量的兩個數的交換可以這麼寫:

void swap(int &a, int &b)
{             //  a            b
    a = a^b;  // a^b           b
    b = a^b;  // a^b          a^b^b
    a = a^b   // a^b^a^b^b=b  a^b^b=a
}

回到這一題,重複的兩個數異或爲0,把數組裏的數都異或時,那個單獨的數字就會顯現出來了。

代碼如下:

int singleNumber(int* nums, int numsSize) {
    int ans=0;
    for(int i=0;i<numsSize;i++)
    {
        ans= ans^nums[i];
    }
    return ans; 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章