原題:
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。
A | B | P |
---|---|---|
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;
}